我正在尝试从源代码编译旧版本(5.6.38)的 PHP,尽管我认为这个问题可能更多的是关于构建软件,其中所需的库位于非标准位置,而不是专门针对 PHP。
当我运行 make 时,出现以下错误:
/usr/bin/ld: warning: libicuuc.so.72, needed by /usr/lib/gcc/x86_64-linux-gnu/12/../../../x86_64-linux-gnu/libxml2.so, may conflict with libicuuc.so.69
Generating phar.php
/tmp/tarballs/php-5.6.38/sapi/cli/php: error while loading shared libraries: libicudata.so.69: cannot open shared object file: No such file or directory
make: *** [Makefile:375: ext/phar/phar.php] Error 127
我的配置如下:
CPPFLAGS='-DU_USING_ICU_NAMESPACE=1 -DU_DEFINE_FALSE_AND_TRUE=1' PHP_RPATHS=/opt/icu/lib ./configure --prefix=/opt/php-5.6.38 \
--enable-fpm \
--with-fpm-user=www-data \
--enable-mbstring \
--enable-ftp \
--with-jpeg-dir=/opt/libjpeg-turbo \
--with-gd \
--with-gettext \
--with-iconv \
--with-xmlrpc \
--with-gmp \
--enable-intl \
--with-icu-dir=/opt/icu \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-zlib \
--with-kerberos \
--with-png-dir=/usr \
--with-freetype-dir=/opt/freetype \
--with-mcrypt \
--with-mhash \
--with-tidy=/opt/tidy-html5
我尝试使用(作为配置命令的一部分):
LDFLAGS="-Wl,-rpath,/opt/icu/lib -R/opt/icu/lib -L/opt/icu/lib"
以及与之相关的各种变体,但 make 上总是出现相同的错误。 我可以让它编译而不出现错误的唯一方法是运行
LD_LIBRARY_PATH="/opt/icu/lib:${LD_LIBRARY_PATH}" make
但我认为虽然这将允许 make 完成,但它并不能解决实际问题,并且当 php 运行时,它仍然会在系统位置中查找 icu lib,而不是我想要的非标准位置正在寻找。
任何人都可以建议我需要做什么才能在像这样的非标准位置使用 icu lib 进行编译吗?
使用非标准位置的库编译 PHP 5.6.38 时,您可能会遇到与 ICU 库类似的问题。看来您需要确保构建和运行时链接器都知道在哪里可以找到这些库。
首先,您的 CPPFLAGS 和 LDFLAGS 应设置正确。您的 LDFLAGS 已经走在正确的轨道上,但可能需要进行一些小调整。
CPPFLAGS='-I/opt/icu/include -DU_USING_ICU_NAMESPACE=1 -DU_DEFINE_FALSE_AND_TRUE=1' \
LDFLAGS="-L/opt/icu/lib -Wl,-rpath,/opt/icu/lib" \
PHP_RPATHS=/opt/icu/lib \
./configure --prefix=/opt/php-5.6.38 \
--enable-fpm \
--with-fpm-user=www-data \
--enable-mbstring \
--enable-ftp \
--with-jpeg-dir=/opt/libjpeg-turbo \
--with-gd \
--with-gettext \
--with-iconv \
--with-xmlrpc \
--with-gmp \
--enable-intl \
--with-icu-dir=/opt/icu \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-zlib \
--with-kerberos \
--with-png-dir=/usr \
--with-freetype-dir=/opt/freetype \
--with-mcrypt \
--with-mhash \
--with-tidy=/opt/tidy-html5
enter code here
确保运行时链接器可以找到您的库。一种方法是在运行 make 之前以及运行 PHP 时在您的环境中设置 LD_LIBRARY_PATH
export LD_LIBRARY_PATH="/opt/icu/lib:${LD_LIBRARY_PATH}"
make
如果这有帮助或者您遇到任何其他问题,请告诉我