Подтвердить что ты не робот

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, но я не хочу этого делать, поскольку в зависимости от этого у меня много портов.

4b9b3361

Ответ 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. Существует множество связанных с этим вопросов о стекопереработке, которые на самом деле не решают основную проблему, поэтому я создал ответ здесь, в котором подробно объясняется, что происходит и как решить.