PHP неправильно связывает разделяемую библиотеку MySQL при сборке - PullRequest
3 голосов
/ 31 августа 2011

Я пытаюсь собрать PHP на моем новом компьютере с такой конфигурацией:

export MACOSX_DEPLOYMENT_TARGET=10.7 CFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" LIBS=-lresolv
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib
./configure --prefix=/usr/local --with-apxs2=/usr/sbin/apxs --with-ldap=/usr --with-kerberos=/usr --enable-cli --with-zlib-dir=/usr --enable-exif --enable-ftp --enable-mbstring --enable-mbregex --enable-sockets --with-iodbc=/usr --with-curl=/usr --with-config-file-path=/etc --sysconfdir=/private/etc --with-mysql-sock=/var/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql=/usr/local/mysql --with-openssl=/usr --with-xmlrpc --with-xsl=/usr --without-pear --with-libxml-dir=/usr --with-iconv=/usr/local --with-pdo-mysql=/usr/local/mysql/bin/mysql_config --with-gd --with-jpeg-dir=/usr/local/Cellar --with-png-dir=/usr/X11 --with-freetype-dir=/usr/X11 --with-mcrypt=/usr/local/Cellar --enable-pcntl

Конфигурация работает нормально, но когда я пытаюсь запустить "make", она заканчивается этой ошибкой:

Generating phar.phar
dyld: Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/mdiamond/Downloads/php-5.3.8/sapi/cli/php
  Reason: image not found
make: *** [ext/phar/phar.phar] Trace/BPT trap: 5

Это довольно странно, учитывая, что я указал "export DYLD_LIBRARY_PATH = / usr / local / mysql / lib", и libmysqlclient.18.dylib находится на этом пути. Кажется, компоновщик ищет libmysqlclient.18.dylib без пути (в корне?). Я также запустил otool на моем PHP-бинарнике и получил это:

/usr/lib/libexslt.0.dylib (compatibility version 9.0.0, current version 9.13.0)
/usr/lib/libiodbc.2.dylib (compatibility version 4.0.0, current version 4.18.0)
libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
/usr/local/lib/libmcrypt.4.dylib (compatibility version 9.0.0, current version 9.8.0)
/usr/local/lib/libltdl.7.dylib (compatibility version 11.0.0, current version 11.0.0)
/System/Library/Frameworks/LDAP.framework/Versions/A/LDAP (compatibility version 1.0.0, current version 2.2.0)
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/X11/lib/libfreetype.6.dylib (compatibility version 13.0.0, current version 13.2.0)
/usr/X11/lib/libpng15.15.dylib (compatibility version 17.0.0, current version 17.0.0)
/usr/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
/usr/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libcurl.4.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 46.0.0)
/usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.3.0)
/usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 46.1.0)
/System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos (compatibility version 5.0.0, current version 6.0.0)
/usr/lib/libxslt.1.dylib (compatibility version 3.0.0, current version 3.24.0)

Обратите внимание, что libmysqlclient - единственная библиотека без пути. Кто-нибудь знает, как я могу решить это? Я неправильно запускаю конфигурацию?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

У меня была похожая проблема, и я думаю, что это было связано с тем фактом, что /usr/local/mysql имеет символическую ссылку на /usr/local/mysql-5.5.15-osx10.6-x86_64 на моем компьютере (MySQL установлен через DMG). Изменение DYLD_LIBRARY_PATH на использование полного пути, похоже, заставило make работать на меня.

Однако во время процесса make install я столкнулся с проблемой последующих действий. То же сообщение об ошибке появилось во время шага Installing PEAR environment. Решение проблемы состояло в том, чтобы сделать это заранее:

install_name_tool -change libmysqlclient.18.dylib \
  /usr/local/mysql-5.5.15-osx10.6-x86_64/lib/libmysqlclient.18.dylib \
  /path/to/php-5.3.8/sapi/cli/php
1 голос
/ 16 июня 2013

Подобное произошло со мной, когда я попытался скомпилировать PHP 5.4.16 вместе с MariaDB 5.5 на MacOS X 10.6.8 Snow Leopard.Во время make процесс неожиданно остановился с этим сообщением об ошибке:

Undefined symbols:
 "_res_9_dn_expand", referenced from:
 _php_parserr in dns.o
 _php_parserr in dns.o
 _php_parserr in dns.o
 _php_parserr in dns.o
 _php_parserr in dns.o
 _php_parserr in dns.o
 _php_parserr in dns.o
 _zif_dns_get_mx in dns.o
 "_res_9_search", referenced from:
 _zif_dns_check_record in dns.o
 _zif_dns_get_mx in dns.o
 _zif_dns_get_record in dns.o
 "_res_9_init", referenced from:
 _zif_dns_check_record in dns.o
 _zif_dns_get_mx in dns.o
 _zif_dns_get_record in dns.o
 "_res_9_dn_skipname", referenced from:
 _zif_dns_get_mx in dns.o
 _zif_dns_get_mx in dns.o
 _zif_dns_get_record in dns.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1

Я использую целую кучу нестандартных каталогов для запуска моего сервера (apache с PHP-CGI), поэтому моя конфигурациянастройки несколько странные и бесполезные для других.Они работали для всей ветви PHP 5.4 с MariaDB 5.2, и только сегодня он перестал работать, как и ожидалось.

Благодаря вашим сообщениям, это то, что я придумал, чтобы заставить его скомпилировать и установить успешноеще раз (конечно, измените пути в зависимости от собственных требований):

  1. до compile, укажите путь к каталогу lib базы данных:

    export DYLD_LIBRARY_PATH=/customserver/maria55/lib

  2. запустить ./compile с необходимыми параметрами

  3. выполнить make
  4. запустить это, чтобы исправить неправильный путь кКлиентская библиотека mysql внутри двоичных файлов CGI и CLI:

    install_name_tool -change install_name_tool -change libmysqlclient.18.dylib /customserver/maria55/lib/libmysqlclient.18.dylib /sources/php-5.4.16/sapi/cli/php

    install_name_tool -change libmysqlclient.18.dylib /customserver/maria55/lib/libmysqlclient.18.dylib /sources/php-5.4.16/sapi/cgi/php-cgi

  5. run sudo make install

Надеюсь, что это полезно для других в той же ситуации

0 голосов
/ 18 октября 2013

Вторая ошибка _php_parserr in dns.o (упомянутая здесь и здесь ) также может быть устранена с помощью следующих действий:

Отредактируйте Makefile и добавьтеследующий флаг к разделу EXTRA_LIBS = (в дополнение к другим уже имеющимся флагам):

EXTRA_LIBS = -lsresolv

Хотя, если вы можете решить его, изменив пути, как упомянуто выше, это было бы предпочтительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...