libiconv和MacOS

时间:2012-09-27 10:45:22

标签: gcc osx-lion iconv libiconv

我正在尝试在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的解决方案,但我不想这样做,因为我有很多端口,具体取决于它。

5 个答案:

答案 0 :(得分:3)

我通过在/usr/lib/opt/local/lib中加入两个libiconv来解决这个问题。这是一种解决的hacky方式,如果有人有更好的解决方案,请发帖。假设[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/

答案 1 :(得分:3)

我解决了它:

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

即使这是一个老线程,下面的解决方案可能会帮助搜索历史问题的人寻求帮助。这是一个简单的单行命令,可以使用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

答案 4 :(得分:0)

针对旧问题的新答案。简短的答案是您的系统上有多个iconv库。关于stackoverflow的大量相关问题并不能真正回答根本问题,因此我创建了一个答案over here,它解释了正在发生的事情以及如何解决。