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.2
readelf -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/php
libxml2のリンクされたバージョンが私が指定したバージョンと異なる理由です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
...私はldconfig
libxml2と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
構成スクリプトのパラメーターは次のとおりです。場所したがって、変数の前に、LDFLAGS
libtoolは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にファイルをシンボリックリンクすることです。