La bibliothèque GNU C fournit une implémentation de iconv – comment l’utiliser?
Programme simple:
#include int main( int argc, char **argv ) { iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" ); iconv_close( cd ); return 0; }
Comstackr et lier:
$ 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
Listez les symboles pour montrer qu’ils existent!
$ nm -D /lib/libc-2.12.1.so | grep iconv 00017920 T iconv 00017ae0 T iconv_close 00017720 T iconv_open
Si j’installe la bibliothèque GNU libiconv dans / usr / local et que je lie avec -liconv, cela fonctionne. Comment puis-je établir un lien avec la mise en œuvre glibc de iconv?
EDIT: Plus d’informations demandées à partir des commentaires:
Liste tous les fichiers iconv.h dans / usr (1 correspondance)
$ find /usr/ | grep "iconv\.h" /usr/include/iconv.h
Réinstallez libc6-dev pour vous assurer que le bon en-tête est installé.
$ 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) ...
Comstackz et reliez à nouveau avec l’option de préprocesseur suggérée:
$ 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
Sortie de 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
copie passée de /usr/include/iconv.h
Correction: le redémarrage a corrigé le problème. Je soupçonne qu’une copie en cache de libiconv était à l’origine des conflits, même si elle avait été supprimée du disque.
Votre programme semble bien et comstack bien sur mon système (Mandriva Linux 2010.1).
Je trouve cependant libiconv_*
références de libiconv_*
dans votre journal de compilation. Etes-vous sûr que la version iconv.h
qui est incluse provient de glibc et non d’une implémentation libiconv séparée, telle que GNU libiconv? Il semble que cela ajoute un préfixe lib
à toutes les fonctions iconv pour éviter les conflits de symboles avec l’implémentation iconv de la bibliothèque C fournie avec le système.
Avoir à se lier explicitement à libiconv pointe également vers une implémentation iconv distincte – la glibc n’en a pas besoin.
MODIFIER:
Pour mémoire, je viens de vérifier que l’utilisation du fichier d’en-tête iconv.h
de libiconv sans le lier explicitement produira exactement le résultat affiché: il renomme toutes les fonctions iconv en ajoutant un préfixe lib
à leur nom.