我正在尝试在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的解决方案,但我不想这样做,因为我有很多端口,具体取决于它。
答案 0 :(得分:3)
我通过在/usr/lib
和/opt/local/lib
中加入两个libiconv来解决这个问题。这是一种解决的hacky方式,如果有人有更好的解决方案,请发帖。假设[gcc-src]
是gcc的源目录。我所做的如下:
/usr/lib
,复制 libiconv.*
为libiconv1.*
[gcc-src]/gcc/Makefile.in
LIBINTL = @LIBINTL@
至
LIBINTL = @LIBINTL@ -L/opt/local/lib -liconv -L/usr/lib -liconv1
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 ++。make
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 distclean
或make 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,它解释了正在发生的事情以及如何解决。