Libiconv и MacOS
Я пытаюсь скомпилировать GCC 4.5.1 в Mac OS X Lion.
У меня проблема с libiconv. Сначала он жаловался на символы undefined для архитектуры x86_64, которые были: _iconv, _iconv_open и _iconv_close. Я узнал, что версия libiconv MacPorts переименовывает их в: _libiconv, _libiconv_open и _libiconv_close. Поэтому я связался с родным libiconv Mac OS в /usr/lib вместо библиотеки MacPorts в /opt/local/lib.
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)
Однако после этого я попытался перестроить его с самого начала (очистка и все), но затем он жаловался в другой точке на символы undefined, но на этот раз _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)
Есть ли какие-либо идеи о том, как я могу справиться с этим? Я нашел некоторые решения, удаляющие libiconv из MacPorts, но я не хочу этого делать, поскольку в зависимости от этого у меня много портов.
Ответы
Ответ 1
Я решаю это, включив два libiconv из /usr/lib
и /opt/local/lib
. Это хакерский способ решить, если кто-то имеет лучшее решение, отправьте сообщение. Предположим, что [gcc-src]
является исходным каталогом gcc. Я сделал следующее:
- В
/usr/lib
скопируйте libiconv.*
как libiconv1.*
- Перейдите к
[gcc-src]/gcc/Makefile.in
изменение LIBINTL = @[email protected]
в LIBINTL = @[email protected] -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]
< - должен быть абсолютный адрес. Я использую maccc-made gcc и g++. Возможно, использование gcc и g++ из работы системы тоже.
-
make
-
make install
Бинарный файл будет находиться в [gcc-src]/bin/
Ответ 2
Я решил это:
$ sudo port -f deactivate libiconv
$ ...build my project...
$ sudo port activate libiconv
Вероятно, лучший способ, но я не использую GCC напрямую, поэтому это помогает в качестве временного решения.
Ответ 3
Похоже, что ваш make clean
фактически не удалял libbackend.a
из каталога сборки; вы по-прежнему пытались установить связь со старой версией вашего кода, скомпилированной с MacPorts. В ручном режиме rm libbackend.a
(или make distclean
или make spotless
или что-то, что действительно должно очистить все), возможно, исправлена проблема, правильно?
Ответ 4
Несмотря на то, что это старая ветка, приведенное ниже решение может помочь кому-то в поиске помощи по историческим вопросам. Это простая однострочная команда, которая исправит проблему, используя 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 '[email protected]\(iconv[^\(]*(\)@_lib\[email protected]' \
$(grep -l -r 'iconv[^\(]*(' . 2>/dev/null)
Я использовал вышеуказанное решение для этого проекта: https://github.com/jlinoff/gcc-6.4.0-boost-1.66.
Ответ 5
Новый ответ на старый вопрос. Короткий ответ: у вас в системе есть несколько библиотек iconv. Существует множество связанных с этим вопросов о стекопереработке, которые на самом деле не решают основную проблему, поэтому я создал ответ здесь, в котором подробно объясняется, что происходит и как решить.