libiconv и MacOS
Я пытаюсь скомпилировать GCC 4.5.1 в Mac OS X Lion.
У меня проблема с libiconv. Сначала он жаловался на неопределенные символы для архитектуры 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)
Однако после этого я попытался перестроить его с самого начала (очистка и все остальное), но затем он пожаловался в другой момент о неопределенных символах, но на этот раз _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, но я не хочу этого делать, так как у меня много портов в зависимости от этого.
4 ответа
Я решил это:
$ sudo port -f deactivate libiconv
$ ...build my project...
$ sudo port activate libiconv
Вероятно, есть лучший способ, но я не использую GCC напрямую, так что это помогает в качестве временного решения.
Я решаю это путем включения двух libiconv из обоих /usr/lib
а также /opt/local/lib
, Это хакерский способ решить, если у кого-то есть лучшее решение, пожалуйста, напишите. предполагать [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]
<- должен быть абсолютным адресом. Я использую MacPC GCC и G ++. Возможно использование gcc и g ++ из системной работы тоже. make
make install
Двоичный файл будет в[gcc-src]/bin/
Несмотря на то, что это старая ветка, приведенное ниже решение может помочь кому-то в поиске помощи по историческим вопросам. Это простая однострочная команда, которая исправит проблему, используя 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.
Выглядит как твой make clean
на самом деле не удалить libbackend.a
из каталога сборки; вы все еще пытались установить связь со старой версией вашего кода, скомпилированной для MacPorts. Вручную rm libbackend.a
(или же make distclean
или же make spotless
или что-то, что действительно должно все вычистить) наверно исправили проблему, верно?
Новый ответ на старый вопрос. Короткий ответ: у вас в системе есть несколько библиотек iconv. Существует множество связанных вопросов о стекопереработке, которые на самом деле не отвечают на основную проблему, поэтому я создал ответ, который объясняет, что происходит в глубине и как решить.