GNU C库提供了iconv的实现-如何使用它?
简单程序:
#include <iconv.h>
int main( int argc, char **argv ) {
iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" );
iconv_close( cd );
return 0;
}
编译并链接:
$ 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
列出符号以显示它们的存在!
$ 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个匹配项)
$ find /usr/ | grep "iconv\.h"
/usr/include/iconv.h
重新安装libc6-dev以确保安装了正确的头。
$ 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) ...
使用建议的预处理器选项再次编译并链接:
$ 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的输出:
$ 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
已解决:重新启动已解决了该问题。我怀疑libiconv的缓存副本导致了冲突,即使它已从磁盘中删除也是如此。
最佳答案
您的程序看起来不错,并且可以在我的系统上正常编译(Mandriva Linux 2010.1)。
不过,我在编译日志中发现libiconv_*
引用令人担忧。您确定所包含的iconv.h
版本来自glibc,而不是来自单独的libiconv实现,例如GNU libiconv吗?听起来好像在所有iconv函数上添加了lib
前缀,以避免符号与系统附带的C库的iconv实现冲突。
必须显式链接到libiconv也指向单独的iconv实现-glibc不需要它。
编辑:
作为记录,我刚刚验证了使用libiconv中的iconv.h
头文件而不显式链接该文件将产生您所看到的确切结果-它通过在名称中添加lib
前缀来重命名所有iconv函数。