【问题标题】:How to build a static lib of iconv on OSX without libiconv symbol names?如何在没有 libiconv 符号名称的 OSX 上构建 iconv 的静态库?
【发布时间】:2017-03-20 18:03:21
【问题描述】:

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

make clean && make CPPFLAGS=-DLIBICONV_PLUG

我收到错误,因为有几件事没有定义,例如 ICONV_GET_DISCARD_ILSEQ 和 ICONV_SET_HOOKS。再看头文件,只有在没有定义LIBICONV_PLUG的情况下才定义这些。

我的问题是,我是否正确使用了 LIBICONV_PLUG?有没有其他方法可以获取包含我需要的符号的静态库?我应该遍历未定义的符号并自己手动定义它们吗?

【问题讨论】:

    标签: c++ macos makefile iconv


    【解决方案1】:

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

    • 正常的是,在目标文件级别,它定义了符号'libiconv_open'等,以免与操作系统的标准库冲突。 C 级别和目标文件级别的符号之间的映射发生在 中。

      如果您将系统的 与 GNU libiconv.{so,dylib,a} 一起使用,则会出现链接错误,反之亦然。这是一个特性,因为两者的特性略有不同(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。

    在您的情况下,您只想让某些免费软件包(例如 libxml2)使用 GNU libiconv,最简单的方法是采用第一种方法,在编译该软件包期间,使用 -I 和 - l 选项让它找到 GNU libiconv 头文件和库。

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

    【讨论】:

    • 非常感谢您提供信息丰富且详尽的回答!
    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 2021-09-02
    • 2011-05-08
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多