2016-11-07 29 views
1

我试图在OSX上建立gnu iconv作为静态库。这不是一个问题,它建立罚款如何在没有libiconv符号名称的OSX上构建iconv的静态库?

./configure --enable-static 
make clean && make 

,但是当我在libiconv.a运行处,我得到下面的结果

... 
_libiconv 
_libiconv_open_ 
_libiconv_close_ 
... 

这是有问题的,因为我想用建立的libxml2这个库,它需要以下符号

iconv 
iconv_open 
iconv_close 

通过头文件看,好像这两个符号名称之间的区别是LIBICONV_PLUG是否定义。但是,当我运行作出

make clean && make CPPFLAGS=-DLIBICONV_PLUG 

我得到的错误,因为一些事情没有定义,如ICONV_GET_DISCARD_ILSEQ和ICONV_SET_HOOKS。再次查看头文件,只有在未定义LIBICONV_PLUG时才会定义这些文件。

我的问题是,我正确使用LIBICONV_PLUG?有没有其他的方式来获得我需要的符号静态库?我是否应该通过未定义的符号并亲自定义它们?

回答

2

有三种可能的方式来构建和使用GNU libiconv。 在所有这三种情况下,C或C++程序使用的符号(通过头文件)都是'iconv_open','iconv','iconv_close'。

  • 正常之一在于,在目标文件的水平,它定义符号“libiconv_open”等,从而不与所述操作系统的标准库冲突。 C级和目标文件级符号之间的映射发生在<iconv.h>。

    如果您使用系统的<iconv.h>以及GNU libiconv {so,dylib,a},反之亦然,您将收到链接错误。这是一个特性,因为两者有一些不同的特性(OS X libiconv.dylib支持名为“UTF-8-MAC”的编码,而GNU libiconv有许多改进和修复),不匹配会导致麻烦。

  • 如果您是系统供应商,您可以通过定义'iconv_open'而不是'libiconv_open'等来构建GNU libiconv,这可以通过简单编辑iconv.h来实现。

    或者,特别是在OS X上,您可以从https://opensource.apple.com/中选择libiconv并自行编译它。但请注意,这个版本是基于GNU libiconv 1.11的,也就是说,它已经很老了。

  • 正如在GNU libiconv的自述文件中所解释的,LIBICONV_PLUG标志创建了一个将覆盖系统功能的库;这仅适用于GNU,Solaris和OSF/1。

在你的情况,你只希望有GNU libiconv的一些免费的软件包(如libxml2的)中使用,最简单的方法是采取第一种方法,而该包,使用编译期间-I和-L选项使它找到GNU libiconv头文件和库。

事实上,libxml2的让一切变得简单:它的配置脚本已--with-的iconv选项= 前缀,通过它您可以指定您已在前缀安装GNU libiconv的(头文件的目录层次结构/include /和目标文件前缀/lib /);配置脚本将会合成相应的-I和-L选项。

+0

非常感谢您提供丰富翔实的答案! – Sossisos

相关问题