首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何链接glibc的iconv实现?

如何链接glibc的iconv实现?
EN

Stack Overflow用户
提问于 2011-01-17 08:59:31
回答 1查看 12.4K关注 0票数 5

GNU C库提供了iconv的实现--我该如何使用它?

简单的程序:

代码语言:javascript
复制
#include <iconv.h>

int main( int argc, char **argv ) {
        iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" );
        iconv_close( cd );
        return 0;
}

编译和链接:

代码语言:javascript
复制
$ 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

列出符号以显示它们的存在!

代码语言:javascript
复制
$ 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个匹配项)

代码语言:javascript
复制
$ find /usr/ | grep "iconv\.h"
/usr/include/iconv.h

重新安装libc6-dev以确保安装了正确的头文件。

代码语言:javascript
复制
$ 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) ...

使用建议的预处理器选项重新编译和链接:

代码语言:javascript
复制
$ 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的输出:

代码语言:javascript
复制
$ 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的缓存副本导致了冲突,尽管它已从磁盘中删除。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-17 09:06:15

您的程序看起来很好,并且在我的系统(Mandriva Linux 2010.1)上编译得很好。

不过,我发现编译日志中的libiconv_*引用令人担忧。您确定包含的iconv.h版本来自glibc,而不是来自单独的libiconv实现,例如GNU libiconv?听起来好像它为所有的iconv函数添加了一个lib前缀,以避免与系统附带的C库的iconv实现发生符号冲突。

必须显式链接到libiconv也指向单独的iconv实现- glibc不需要它。

编辑:

根据记录,我刚刚验证了使用libiconv中的iconv.h头文件而不显式链接它是否会产生您所看到的结果-它通过为所有iconv函数的名称添加一个lib前缀来重命名它们。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4709178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档