如何在没有libiconv符号名的OSX上构建iconv的静态库

How to build a static lib of iconv on OSX without libiconv symbol names?

本文关键字:OSX 构建 iconv 静态 符号 libiconv      更新时间:2023-10-16

我试图在OSX上构建gnu iconv作为静态库。这不是问题,使用

就可以了。
./configure --enable-static
make clean && make

但是当我在libiconv上运行nm时。a,我得到以下结果

...
_libiconv
_libiconv_open_
_libiconv_close_
...

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

iconv
iconv_open
iconv_close

查看头文件,这两个符号名之间的区别似乎在于是否定义了LIBICONV_PLUG。但是当我运行make as

make clean && make CPPFLAGS=-DLIBICONV_PLUG

我得到错误,因为几个东西没有定义,如ICONV_GET_DISCARD_ILSEQ和ICONV_SET_HOOKS。再次查看头文件,只有在LIBICONV_PLUG未定义时才定义这些参数。

我的问题是,我是否正确使用LIBICONV_PLUG ?是否有其他方法来获得我需要的符号的静态库?我应该遍历未定义的符号,然后自己动手定义它们吗?

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

  • 正常的是,在对象文件级别,它定义符号'libiconv_open'等,以便不与操作系统的标准库冲突。符号在C级和对象文件级之间的映射发生在使用GNU libconv。{so,dylib,a},反之亦然。这是一个特性,因为两者的特性略有不同(OS X libiconv。dylib支持名为"UTF-8-MAC"的编码,而GNU libiconv有许多改进和修复),不匹配会导致麻烦。

  • 如果你是一个系统供应商,你可以用这样的方式来构建GNU libiconv,它定义了'iconv_open'而不是'libiconv_open',等等。这可以通过对icon .h的简单编辑来实现。

    或者,特别是在OS X上,您可以从https://opensource.apple.com/中选择libiconv并为自己编译它。但是要注意,这个版本是基于GNU libiconv 1.11的,也就是说,它是相当旧的。

  • 正如GNU libiconv的README中所解释的,LIBICONV_PLUG标志创建了一个库,该库将覆盖系统中的功能;

  • 仅适用于GNU、Solaris和OSF/1。

在您的情况下,如果您只想让GNU libiconv被一些自由软件包(如libxml2)使用,最简单的方法是采用第一种方法,并在该包的编译过程中,使用-I和-L选项使其找到GNU libiconv头文件和库。

事实上,libxml2使这很容易:它的配置脚本已经有一个选项——with-iconv=prefix,通过它可以指定安装GNU libiconv的目录层次结构(prefix/include/中的头文件和prefix/lib/中的目标文件);然后configure脚本将合成适当的-I和-L选项。