How do I link glibc's implementation of iconv?
GNU C库提供了iconv的实现-如何使用它?
简单程序:
1 2 3 4 5 6 7 | #include <iconv.h> int main( int argc, char **argv ) { iconv_t cd = iconv_open("UTF-8","ISO-8859-1" ); iconv_close( cd ); return 0; } |
编译并链接:
1 2 3 4 5 | $ 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 |
列出符号以显示它们的存在!
1 2 3 4 | $ nm -D /lib/libc-2.12.1.so | grep iconv 00017920 T iconv 00017ae0 T iconv_close 00017720 T iconv_open |
如果我将GNU libiconv库安装到/ usr / local并与-liconv链接,它将起作用。如何与iconv的glibc实现链接?
编辑:根据评论的要求提供更多信息:
列出/ usr中的所有iconv.h文件(1个匹配项)
1 2 | $ find /usr/ | grep"iconv\\.h" /usr/include/iconv.h |
重新安装libc6-dev以确保安装了正确的头文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ 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) ... |
使用建议的预处理器选项编译并再次链接:
1 2 3 4 5 | $ 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 |
gcc -H:
的输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ 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 |
/usr/include/iconv.h
的副本
已修复:重新启动已解决此问题。我怀疑libiconv的缓存副本导致了冲突,即使它已从磁盘中删除也是如此。
您的程序似乎正常运行,并且可以在我的系统上正常编译(Mandriva Linux 2010.1)。
我在您的编译日志中发现了
必须显式链接到libiconv也指向单独的iconv实现-glibc不需要它。
编辑:
作为记录,我刚刚验证了使用libiconv中的