如何在 OSX 上构建没有 libiconv 符号名称的 iconv 静态库?
How to build a static lib of iconv on OSX without libiconv symbol names?
我正在尝试在 OSX 上构建 gnu iconv 作为静态库。这不是问题,它可以很好地构建
./configure --enable-static
make clean && make
但是当我在 libiconv.a 上 运行 nm 时,我得到以下结果
...
_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?还有其他方法可以使用我需要的符号获取静态库吗?我是否应该遍历未定义的符号并自己手动定义它们?
可以通过三种方式构建和使用 GNU libiconv。
在所有这三种情况下,它为 C 或 C++ 程序(通过头文件)定义的符号是 'iconv_open'、'iconv'、'iconv_close'.
正常的是在目标文件级别,定义符号'libiconv_open'等,以免与操作系统的标准库冲突。 C 级别和目标文件级别的符号之间的映射发生在 .
如果您将系统的 与 GNU libiconv.{so,dylib,a} 一起使用,您将收到 link 错误,反之亦然。这是一个特性,因为两者的特性略有不同(OS X libiconv.dylib 支持名为 "UTF-8-MAC" 的编码,而 GNU libiconv 有许多改进和修复)并且不匹配会导致麻烦.
如果您是系统供应商,您可以构建 GNU libiconv,使其定义 'iconv_open' 而不是 'libiconv_open',等等。这是通过一个简单的实现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=prefix,通过它您可以指定安装的目录层次结构GNU libiconv(头文件在prefix/include/,目标文件在prefix/lib/);然后配置脚本将合成适当的 -I 和 -L 选项。
我正在尝试在 OSX 上构建 gnu iconv 作为静态库。这不是问题,它可以很好地构建
./configure --enable-static
make clean && make
但是当我在 libiconv.a 上 运行 nm 时,我得到以下结果
...
_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?还有其他方法可以使用我需要的符号获取静态库吗?我是否应该遍历未定义的符号并自己手动定义它们?
可以通过三种方式构建和使用 GNU libiconv。 在所有这三种情况下,它为 C 或 C++ 程序(通过头文件)定义的符号是 'iconv_open'、'iconv'、'iconv_close'.
正常的是在目标文件级别,定义符号'libiconv_open'等,以免与操作系统的标准库冲突。 C 级别和目标文件级别的符号之间的映射发生在
. 如果您将系统的
与 GNU libiconv.{so,dylib,a} 一起使用,您将收到 link 错误,反之亦然。这是一个特性,因为两者的特性略有不同(OS X libiconv.dylib 支持名为 "UTF-8-MAC" 的编码,而 GNU libiconv 有许多改进和修复)并且不匹配会导致麻烦. 如果您是系统供应商,您可以构建 GNU libiconv,使其定义 'iconv_open' 而不是 'libiconv_open',等等。这是通过一个简单的实现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=prefix,通过它您可以指定安装的目录层次结构GNU libiconv(头文件在prefix/include/,目标文件在prefix/lib/);然后配置脚本将合成适当的 -I 和 -L 选项。