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. Я сделал следующее:

  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] <- должен быть абсолютным адресом. Я использую MacPC GCC и G ++. Возможно использование gcc и g ++ из системной работы тоже.
  4. make
  5. 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. Существует множество связанных вопросов о стекопереработке, которые на самом деле не отвечают на основную проблему, поэтому я создал ответ, который объясняет, что происходит в глубине и как решить.

Другие вопросы по тегам