gpt4 book ai didi

c - 如何链接 glibc 的 iconv 实现?

转载 作者:IT王子 更新时间:2023-10-29 01:06:35 38 4
gpt4 key购买 nike

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 以确保安装了正确的 header 。

$ 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 头文件而不明确链接它会产生您所看到的完全相同的结果 - 它通过添加一个重命名所有 iconv 函数lib 前缀。

关于c - 如何链接 glibc 的 iconv 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709178/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com