如何在OSX上构建一个不使用libiconv符号名称的iconv静态库?

4
我正在尝试在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时

make clean && make CPPFLAGS=-DLIBICONV_PLUG

我遇到了错误,因为一些东西没有定义,例如ICONV_GET_DISCARD_ILSEQ和ICONV_SET_HOOKS。再次查看头文件,只有在未定义LIBICONV_PLUG时才会定义这些内容。
我的问题是,我是否正确使用了LIBICONV_PLUG?是否有其他方法可以获得我所需的静态库符号?我应该手动定义未定义的符号吗?
1个回答

8

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

  • 普通的做法是,在目标文件级别上定义符号'libiconv_open'等,以避免与操作系统的标准库冲突。在<iconv.h>中,C级别和目标文件级别之间的映射发生。

    如果你在使用GNU libiconv.{so,dylib,a}时使用系统的<iconv.h>,或者反过来,将会得到链接错误。这是一个特性,因为两者具有略微不同的功能(OS X libiconv.dylib支持名为“UTF-8-MAC”的编码,而GNU libiconv有许多改进和修复),不匹配可能会导致问题。

  • 如果您是系统供应商,可以通过简单编辑iconv.h的方式构建GNU libiconv,使其定义'iconv_open'而不是'libiconv_open'等。

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

  • 如GNU libiconv的README所述,LIBICONV_PLUG标志创建一个将覆盖系统功能的库;这仅适用于GNU、Solaris和OSF/1。

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

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


非常感谢您提供这么详尽和有用的答案! - Sossisos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接