16

我正在尝试在 Mac OS X Lion 中编译 GCC 4.5.1。

我对 libiconv 有疑问。首先它抱怨架构 x86_64 的未定义符号,它们是:_iconv、_iconv_open 和 _iconv_close。我发现 MacPorts 版本的 libiconv 将它们重命名为:_libiconv、_libiconv_open 和 _libiconv_close。所以我链接到 /usr/lib 中的 Mac OS 本机 libiconv 而不是 /opt/local/lib 中的 MacPorts 库。

Undefined symbols for architecture x86_64:
"_iconv", referenced from:
  _convert_using_iconv in libcpp.a(charset.o)
  __nl_find_msg in libintl.a(dcigettext.o)
 (maybe you meant: __cpp_destroy_iconv, _cpp_init_iconv )
"_iconv_close", referenced from:
  __cpp_destroy_iconv in libcpp.a(charset.o)
  __cpp_convert_input in libcpp.a(charset.o)
  __nl_free_domain_conv in libintl.a(loadmsgcat.o)
"_iconv_open", referenced from:
  _init_iconv_desc in libcpp.a(charset.o)
  __nl_init_domain_conv in libintl.a(loadmsgcat.o)

但是,在这样做之后,我尝试从头开始重建它(清理和一切),但后来它在不同的地方抱怨未定义的符号,但这次是 _libiconv、_libiconv_open 和 _libiconv_close。

Undefined symbols for architecture x86_64:
  "_libiconv", referenced from:
    _identifier_to_locale in libbackend.a(pretty-print.o)
  "_libiconv_close", referenced from:
    _identifier_to_locale in libbackend.a(pretty-print.o)
  "_libiconv_open", referenced from:
    _identifier_to_locale in libbackend.a(pretty-print.o)

有什么想法可以解决这个问题吗?我找到了一些从 MacPorts 卸载 libiconv 的解决方案,但我不想这样做,因为我有很多端口取决于它。

4

5 回答 5

7

我通过以下方式解决了它:

$ sudo port -f deactivate libiconv
$ ...build my project...
$ sudo port activate libiconv

可能有更好的方法,但我没有直接使用 GCC,所以这有助于作为临时解决方法。

于 2015-12-07T18:08:25.253 回答
3

我通过包含两个 libiconv/usr/lib/opt/local/lib. 这是一种解决方法,如果有人有更好的解决方案,请发布。假设[gcc-src]是gcc的源目录。我所做的如下:

  1. /usr/lib复制 libiconv.*libiconv1.*
  2. 转到[gcc-src]/gcc/Makefile.in
    更改 LIBINTL = @LIBINTL@LIBINTL = @LIBINTL@ -L/opt/local/lib -liconv -L/usr/lib -liconv1
  3. 配置方式:CC=gcc-mp-4.7 CXX=g++-mp-4.7 ../gcc-4.7.2/configure --with-gmp=/opt/local --enable-languages=c,c++ --enable-checking=release —prefix=[gcc-src] <- 必须是绝对地址。我使用 macport 制造的 gcc 和 g++。也许也可以从系统工作中使用 gcc 和 g++。
  4. make
  5. make install 二进制文件将在[gcc-src]/bin/
于 2014-01-29T21:43:52.723 回答
2

看起来您make clean实际上并没有libbackend.a从构建目录中删除;您仍在尝试链接针对 MacPorts 编译的旧版本代码。手动运行rm libbackend.a(或make distcleanmake spotless或任何应该真正清理所有内容的东西)可能解决了问题,对吧?

于 2013-10-01T19:36:21.167 回答
2

尽管这是一个旧线程,但下面的解决方案可能会帮助有人搜索历史问题以寻求帮助。这是一个简单的单行命令,将使用 sed更正所有 iconv 函数引用来解决问题。

$ tar xf gcc-6.4.0.tar.gz
$ cd gcc=6.4.0
$ # convert iconv(..)       --> _libiconv(..)
$ # convert iconv_open(..)  --> _libiconv_open(..)
$ # convert iconv_close(..) --> _libiconv_close(..)
$ LC_ALL=C time \
    sed -i.bak -e 's@\(iconv[^\(]*(\)@_lib\1@g' \
    $(grep -l -r 'iconv[^\(]*(' . 2>/dev/null)

我为这个项目使用了上述解决方案:https ://github.com/jlinoff/gcc-6.4.0-boost-1.66 。

于 2018-03-10T20:29:36.900 回答
0

老问题的新答案。简短的回答是您的系统上有多个 iconv 库。stackoverflow 上有很多相关问题并没有真正回答根本问题,所以我在这里创建了一个答案,详细解释了正在发生的事情以及如何解决。

于 2019-08-31T02:22:27.267 回答