Comment puis-je créer un lien de glibc mise en œuvre de iconv?
La bibliothèque C de GNU fournit une implémentation de iconv - comment puis-je l'utiliser?
Programme Simple:
#include <iconv.h>
int main( int argc, char **argv ) {
iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" );
iconv_close( cd );
return 0;
}
Compiler 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
Liste des 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 GNU libiconv de la bibliothèque /usr/local et en lien avec liconv il fonctionne. Comment puis-je créer un lien avec la glibc mise en œuvre de iconv?
EDIT: de Plus amples informations demandées à partir des commentaires:
Liste de tous les iconv.h les fichiers dans /usr (1 match)
$ find /usr/ | grep "iconv\.h"
/usr/include/iconv.h
Réinstaller libc6-dev pour assurer 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) ...
Compiler et lier de nouveau proposé de préprocesseur 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
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
pastbin copie de /usr/include/iconv.h
Fixe: Reboot résolu le problème. Je soupçonne une copie en cache de libiconv était à l'origine du conflit, même si il a été supprimé à partir du disque.
Pouvez-vous fournir le contenu de /usr/include/iconv.h dans un pastebin?
et/ou de la sortie de gcc-E?
iconv.h
est très bien. Mais je viens de remarquer quelque chose de bizarre. Dans les deux échec de la gcc s'exécute, le nom du fichier temporaire (/tmp/ccKAfXNg.o
) est le même! Il est censé être aléatoire! Il me semble que si votre linker est de ramasser des fichiers obsolètes...Si j' essayez la demande de pré-processeur définir, il n'a pas de travail, et que l'erreur elle-même était la même que la première erreur, j'ai copié/collé la sortie de la première échec de la compilation... leçon apprise.
OriginalL'auteur x-x | 2011-01-17
Vous devez vous connecter pour publier un commentaire.
Votre programme semble très bien et compile très bien sur mon système (Mandriva Linux 2010.1).
- Je trouver les
libiconv_*
références dans votre compiler journal inquiétant, cependant. Êtes-vous sûr que leiconv.h
version qui inclue vient de la glibc et non pas à partir d'une autre libiconv mise en œuvre, tels que GNU libiconv? Cela sonne comme si elle ajoute unlib
préfixe à tous les iconv fonctions pour éviter symbole de collisions avec la fonction iconv mise en œuvre de la bibliothèque C qui est fourni avec le système.Avoir de lien explicite libiconv points séparés iconv mise en œuvre trop - glibc n'en a pas besoin.
EDIT:
Pour l'enregistrement, j'ai juste vérifié que l'utilisation de la
iconv.h
fichier d'en-tête de libiconv sans relier explicitement contre elle produira exactement le résultat que vous voyez - il renomme tous les iconv fonctions par l'ajout d'unlib
préfixe à leurs noms.pouvez-vous vérifier qui iconv.h est inclus?
Je pense que vous avez encore
/usr/local/include/iconv.h
ou quelque chose...vous pouvez effectuer la vérification en faisant usage de la
-H
option de gcc. Il permet d'imprimer le chemin d'accès des fichiers inclus.L'ajout de
-DLIBICONV_PLUG
à vos options de compilateur de le fixer sans-liconv
? Si c'est le cas, vous êtes à l'aide de laiconv.h
version de libiconv.OriginalL'auteur thkala