Libiconv和MacOS

19

我正在尝试在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
你最终是如何解决它的? - Moj
5个回答

11

我的解决方法是:

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

可能有更好的方法,但我并没有直接使用GCC,所以这只是一个临时解决办法。


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-made gcc和g++。也许使用系统自带的gcc和g++也可以。
  4. make
  5. make install 二进制文件将位于[gcc-src]/bin/

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

谢谢,这个对我有帮助,在 Mojave 上使用 Xcode 10 构建 GCC 6.3.0 阶段1。 - ztalbot
这确实可以编译git(谢谢,这真的很令人沮丧),但需要稍作修改才能使其正常工作:首先,明确指向您的iconv目录。 ./configure --prefix=/usr/local/git-2.23.0 --with-iconv=/usr/local/iconv然后像上面那样修改源代码,但对于我来说,“@_lib\1g”需要改为“@lib\1g”(没有下划线)。此外,上面的命令多了一次更改,因此在compat/precompose_utf8.c中将此行更改回来:“libiconv_ibp cp'”变回“iconv_ibp”。 - John Q
实际上,我很烦恼因为要更改git的源代码来解决iconv库错误问题,所以我深入研究了这个问题,并通过更改Makefile来完全解决了它,使其指向正确版本的iconv库。我创建了一篇文章来解释为什么会出现iconv问题以及如何解决 - John Q

2

看起来你的make clean并没有真正从构建目录中删除libbackend.a;你仍然在尝试链接使用MacPorts编译的旧版本代码。手动运行rm libbackend.a(或make distcleanmake spotless或任何可以真正清理所有东西的命令)可能已经解决了这个问题,对吗?


1

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


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