phpは./configure --with-libxml-dirで指定されたバージョンではなくシステムlibxmlにリンクされています。

phpは./configure --with-libxml-dirで指定されたバージョンではなくシステムlibxmlにリンクされています。

Debian 8システムのソースからphp-5.5.33をビルドしようとしています。configureどちらもmake正常に実行されますが、実行するとmake install次のエラーが発生します。

Installing PEAR environment:      /usr/local/lib/php/
/usr/src/www/php/php-5.5.33/sapi/cli/php: symbol lookup error:     /usr/src/www/php/php-5.5.33/sapi/cli/php: undefined symbol: __xmlFree
Makefile:390: recipe for target 'install-pear-installer' failed
make[1]: *** [install-pear-installer] Error 127
Makefile:393: recipe for target 'install-pear' failed
make: *** [install-pear] Error 2

これを見た後(dirで/usr/src/www/php/php-5.5.33)実行してldd sapi/cli/php次のことを確認しました(ほとんどの出力を省略しました)。

libxslt.so.1 => /usr/lib/x86_64-linux-gnu/libxslt.so.1 (0x00007efd9c207000)
libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007efd9bea0000)

ソースから/usr/local、libxml2-2.9.3、およびlibxslt-1.1.28バージョンまでのローカルインストールの場所を指定するために、および--with-libxml-dirオプションを使用したため、これを見て驚きました。--with-xslまた、出力には次のようなインスタンスが多いため、構成はこのバージョンを選択したようです。

checking for xml2-config path... /usr/local/bin/xml2-config
checking whether libxml build works... yes

make install上記のエラーは、実行中に一致するものが見つからないため、シンボルが__xmlFreeシステムに存在しないため、実際には意味があります。しかし、ローカルにインストールしたバージョンは/usr/lib/x86_64-linux-gnu/libxml2.so.2readelf -s /usr/lib/x86_64-linux-gnu/libxml2.so | grep -i __xmlfreeする次の記号が含まれています。

$ readelf -s /usr/local/lib/libxml2.so.2 | grep -i __xmlfree
1409: 00000000000e0b5c    35 FUNC    GLOBAL DEFAULT   12 __xmlFree
5249: 00000000000e0b5c    35 FUNC    GLOBAL DEFAULT   12 __xmlFree

混乱は、sapi/cli/phplibxml2のリンクされたバージョンが私が指定したバージョンと異なる理由ですconfigure。私のものは/etc/ld.so.conf次のとおりです。

$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

/etc/ld.so.conf.d...次のようにディレクトリを1つのファイルにマージしました。

$ cat /etc/ld.so.conf.d/libs.conf
/usr/local/lib
/usr/lib/x86_64-linux-gnu/libfakeroot

...私はldconfiglibxml2とlibxsltをインストールした後、しかしphpをビルドする前にこれを実行しました。configure私が使用する全体の内容は次のとおりです。

./configure --prefix=/usr/local \
CFLAGS="-O2 -mtune=native -funroll-loops -fPIC" \
--with-libdir=lib \
--with-apxs2=/usr/local/apache2/bin/apxs \
--disable-debug \
--disable-short-tags \
--enable-libgcc \
--enable-shared=yes \
--enable-calendar \
--enable-exif \
--enable-ftp \
--enable-gd-native-ttf \
--enable-mbstring \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-bz2 \
--with-curl=/usr/local \
--with-freetype-dir \
--with-gd \
--with-gnu-ld \
--with-iconv-dir=/usr/local \
--with-jpeg-dir=/usr/local \
--with-ldap=/usr/local \
--with-libxml-dir=/usr/local \
--with-mcrypt \
--with-mhash \
--with-openssl \
--with-openssl-dir=/usr/local \
--with-pear \
--with-pcre-regex=/usr/local \
--with-pcre-dir=/usr/local \
--with-png-dir=/usr/local \
--with-tidy \
--with-readline \
--with-tsrm-pthreads \
--with-xmlrpc \
--with-xsl=/usr/local \
--with-zlib \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--without-sqlite3 \
--without-pdo-sqlite

(また、/usr/localで指定されたすべてのプロジェクトで利用可能なシステムバージョンがある場合、PHPは実際にはそのプロジェクトのシステムバージョンにもリンクされます。そのシステムバージョンがないプロジェクトのみが実際に指定された私にリンクされます。バージョン)。

PHPリンクバージョンが私が表示したバージョンと異なるのはなぜですか?これが起こらなかった場合make install

答え1

非常にUbuntu 12のPHP 5.5とカールに似た問題があります。/usr/local/curl-7.49.1

使用は--with-curl=/usr/local/curl-7.49.1期待どおりに機能しません/usr/lib/x86_64-linux-gnu/libcurl.so。生成されたバイナリが.BTWに接続されました。私の目標は、libcurl.aを使用してカールをPHPバイナリに静的にリンクすることです(バージョンの問題を避けるため)。しかし、これが問題の原因ではありません。

この時点で、環境変数設定を使用してLDFLAGSビルドテストを開始しましたexport LDFLAGS=-L/usr/local/curl-7.49.1/lib。これも機能せず、結果は以前と同じです。

いくつかの調査とテストの後(私はautoconf / Makefileの専門家ではありません;-)、ビルドプロセス中にlibtoolが呼び出されることを発見しました。 libtool -L/usr/lib/x86_64-linux-gnu -L/usr/local/curl-7.49.1/lib [...]

--with-libs構成スクリプトのパラメーターは次のとおりです。場所したがって、変数の前に、LDFLAGSlibtoolはlibcurlファイルをインポートせず、デフォルトシステムからファイルをインポートします。

だからもっと深く掘り下げてEXTRA_LDFLAGS_PROGRAM代わりに設定を試みましたLDFLAGS

export EXTRA_LDFLAGS_PROGRAM=-L/usr/local/curl-7.49.1/lib

これでビルドが成功しました。これが問題を解決する正しい方法なのか、バグなのか、正しくない構成なのかわかりません。誰かが私にこの点を明確にしてくれたら、私はとても嬉しいです。

したがって、状況はまったく同じではありませんが、構成を開始する前に以下を試してください。

export EXTRA_LDFLAGS_PROGRAM=-L/usr/local/lib/

これが役立つ場合は教えてください。

答え2

誰かがこの質問をもう一度調べた場合、その答えは./configureコマンドの--libdir =パラメータにあると確信しています。

  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]

Ubuntuは/usr/lib/x86_64-linux-gnuに多くのライブラリを保持しているため、 --libdir=/usr/lib/x86_64-linux-gnu が必要な場合があります.ソースからlibxmlをビルドして/ usr / localに配置しました。他の場合の最も簡単な解決策は、/usr/local/libから/usr/lib/x86_64 -linux-gnuにファイルをシンボリックリンクすることです。

関連情報