5

Я пытаюсь скомпилировать PHP, и я продолжал получать эту ошибку во время make:

Undefined symbols for architecture x86_64:
  "_iconv_open", referenced from:
      __php_iconv_mime_decode in iconv.o
      __php_iconv_strlen in iconv.o
      _php_iconv_string in iconv.o
      __php_iconv_strpos in iconv.o
      _zif_iconv_substr in iconv.o
      _zif_iconv_mime_encode in iconv.o
      _php_iconv_stream_filter_factory_create in iconv.o
      ...
  "_iconv_close", referenced from:
      __php_iconv_mime_decode in iconv.o
      __php_iconv_strlen in iconv.o
      _php_iconv_string in iconv.o
      __php_iconv_strpos in iconv.o
      _zif_iconv_substr in iconv.o
      _zif_iconv_mime_encode in iconv.o
      _php_iconv_stream_filter_dtor in iconv.o
      ...
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Команда PHP ./configure имеет папку iconv, указывающую на /opt/local , поэтому используется библиотека macv iconv (которая устанавливается с помощью флага +universal ). Делая file я получаю:

/opt/local/lib/libiconv.dylib: Mach-O universal binary with 2 architectures
/opt/local/lib/libiconv.dylib (for architecture i386):  Mach-O dynamically linked shared library i386
/opt/local/lib/libiconv.dylib (for architecture x86_64):    Mach-O 64-bit dynamically linked shared library x86_64

Я попытался установить библиотеку iconv вручную, используя только 64-битную архитектуру (я установил ее в /usr/local), и она работает. Вывод file :

/usr/local/lib/libiconv.dylib: Mach-O 64-bit dynamically linked shared library x86_64

Почему это происходит? Мне удается собрать и заставить работать PHP с ручной установкой, но я не понимаю.

2 ответа2

5

Библиотека iconv MacPorts переименовывает символы в _libiconv_open и _libiconv_close . Вот почему PHP не может их найти, не из-за принудительной 64-битной. Запустите nm /opt/local/lib/libiconv.dylib против nm /usr/lib/libiconv.dylib (в 10.7.3).

0

В моем случае --with-iconv-dir=/usr/lib было недостаточно, я думаю, что эта опция не работает. Поэтому я вручную переименовал /opt/local/lib/libiconv.dylib в /opt/local/lib/libiconv.dylib.bak и после сборки переименовал обратно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .