2011-01-17 5 views
4

Die GNU C-Bibliothek bietet eine Implementierung von iconv - wie verwende ich sie?Wie verknüpfe ich glibcs ​​Implementierung von iconv?

Einfaches Programm:

#include <iconv.h> 

int main(int argc, char **argv) { 
     iconv_t cd = iconv_open("UTF-8", "ISO-8859-1"); 
     iconv_close(cd); 
     return 0; 
} 

Compile und Link:

$ gcc -Wall iconv.c -o iconv 
/tmp/ccKAfXNg.o: In function `main': 
iconv.c:(.text+0x19): undefined reference to `libiconv_open' 
iconv.c:(.text+0x29): undefined reference to `libiconv_close' 
collect2: ld returned 1 exit status 

Liste die Symbole sie existieren zu zeigen!

$ nm -D /lib/libc-2.12.1.so | grep iconv 
00017920 T iconv 
00017ae0 T iconv_close 
00017720 T iconv_open 

Wenn ich die GNU libiconv Bibliothek in/usr/local installieren und Verbindung mit -liconv es funktioniert. Wie verknüpfe ich die glibc-Implementierung von iconv?

EDIT: Weitere Informationen wie aus den Kommentaren angefordert:

Liste aller iconv.h Dateien in/usr (1 Ursache)

$ find /usr/ | grep "iconv\.h" 
/usr/include/iconv.h 

Neu installieren libc6-dev, um sicherzustellen, die richtigen Header installiert ist.

$ dpkg -S /usr/include/iconv.h 
libc6-dev: /usr/include/iconv.h 
$ apt-get install --reinstall libc6-dev 
Reading package lists... Done                                                     
Building dependency tree                                                      
Reading state information... Done                                                    
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 0 not upgraded.                                         
Need to get 0B/4,910kB of archives.                                                    
After this operation, 0B of additional disk space will be used.                                             
(Reading database ... 143458 files and directories currently installed.)                                          
Preparing to replace libc6-dev 2.12.1-0ubuntu10.1 (using .../libc6-dev_2.12.1-0ubuntu10.1_i386.deb) ...                                   
Unpacking replacement libc6-dev ...                                                    
Setting up libc6-dev (2.12.1-0ubuntu10.1) ... 

Compile und Link wieder mit Vorschlägen Präprozessor Option:

$ gcc -Wall -DLIBICONV_PLUG iconv.c -o iconv 
/tmp/ccKAfXNg.o: In function `main': 
iconv.c:(.text+0x19): undefined reference to `libiconv_open' 
iconv.c:(.text+0x29): undefined reference to `libiconv_close' 
collect2: ld returned 1 exit status 

Ausgabe von gcc-H:

$ gcc -H iconv.c 
. /usr/include/iconv.h 
.. /usr/include/features.h 
... /usr/include/bits/predefs.h 
... /usr/include/sys/cdefs.h 
.... /usr/include/bits/wordsize.h 
... /usr/include/gnu/stubs.h 
.... /usr/include/bits/wordsize.h 
.... /usr/include/gnu/stubs-32.h 
.. /usr/lib/gcc/i686-linux-gnu/4.4.5/include/stddef.h 
Multiple include guards may be useful for: 
/usr/include/bits/predefs.h 
/usr/include/gnu/stubs-32.h 
/usr/include/gnu/stubs.h 
/usr/lib/gcc/i686-linux-gnu/4.4.5/include/stddef.h 

pastbin copy of /usr/include/iconv.h

Fixed: Reboot das Problem behoben. Ich vermute, dass eine zwischengespeicherte Kopie von libiconv die Konflikte verursacht hat, obwohl sie von der Festplatte gelöscht wurde.

+0

Kann nicht dupliziert werden. –

+0

Können Sie den Inhalt von /usr/include/iconv.h in einem Pastebin bereitstellen? – thkala

+0

und/oder die Ausgabe von gcc -E? –

Antwort

7

Ihr Programm scheint in Ordnung und kompiliert sich gut auf meinem System (Mandriva Linux 2010.1).

Ich finde die libiconv_* Referenzen in Ihrer Kompilierung log Besorgnis erregend, though. Sind Sie sicher, dass die iconv.h Version, die enthalten ist, von glibc kommt und nicht von einer separaten libiconv-Implementierung, wie GNU libiconv? Es klingt so, als würde allen iconv-Funktionen ein Präfix lib hinzugefügt, um Symbolkollisionen mit der iconv-Implementierung der C-Bibliothek zu vermeiden, die mit dem System geliefert wurde.

Mit explizit Link verweist auf eine separate iconv-Implementierung libiconv auch - glibc es nicht braucht.

EDIT:

Für das Protokoll, ich überprüft nur, dass die iconv.h Header-Datei von libiconv verwenden, ohne explizit die Verknüpfung dagegen produzieren genau das Ergebnis, das Sie sehen - es alle iconv Funktionen umbenennt durch Hinzufügen eines lib Präfix zu ihren Namen.

+0

Ich habe libiconv nach/usr/local installiert, um es zu testen, aber seitdem habe ich es mit 'make uninstall' entfernt - keine Spuren mehr, die ich sehen kann. –

+0

@DrTwox: Können Sie _verify_ welche iconv.h wird enthalten? – thkala

+0

Ich denke, Sie haben noch '/ usr/local/include/iconv.h' oder etwas ... –

Verwandte Themen