PHP 编译 - 链接到库

PHP 编译 - 链接到库

我正在我的服务器上编译 php 5.3.13。我想创建一个 autonome php5 文件夹。所以前缀是:

/usr/local/php5

在这个文件夹中,我有一个 lib 文件夹,其中放置了执行 php 所需的所有 lib,例如:

libk5crypto.so.3
libxml2.so.2
libjpeg.so.62 ....

即使我使用 进行编译--with-jpeg-dir=/usr/local/php5/lib/,php 二进制文件仍在寻找/usr/lib64.

到目前为止我找到的唯一解决方案是手动导出LD_LIBRARY_PATH=/usr/local/php5/lib

我希望在编译时自动进行相同的操作。那可能吗?

答案1

有两个不同的链接器路径,编译时间,以及跑步时间。

我发现 autoconf ( configure) 很少设置为使用备用库位置执行正确的操作,使用--with-something=通常使用不是生成正确的链接器标志(-R-Wl,-rpath)。如果您只有.a库,它就可以工作,但是对于.so库,您需要指定的是RPATH

export PHP_RPATHS=/usr/local/php5/lib
./configure [options as required] 

(在许多情况下,只使用附加LDFLAGSconfigure命令,但 PHP 的构建过程略有不同。)

这有效地向每个二进制文件添加了额外的链接器搜索路径,就好像这些路径是在LD_LIBRARY_PATH默认链接器配置 ( /etc/ld.so.conf) 中指定的一样。这还负责添加,-L/usr/local/php5/lib以便LDFLAGS编译时和运行时使用库来自同一目录(不同位置的版本不匹配可能会出现问题,但您无需在这里担心)。

构建完成后,您可以检查:

 $ objdump -j dynamic -x ./sapi/cli/php | grep RPATH
 RPATH       /usr/local/php5/lib
 $ objdump -j dynamic -x ./libs/libphp5.so | fgrep RPATH
 RPATH       /usr/local/php5/lib

运行ldd还将确认从何处加载哪些库。

真正--with-jpeg-dir应该使用的是指向/usr/local/或某些顶级目录,目录include/lib/,以及可能的其他目录根据编译器/链接器的需要而附加。

--with-jpeg-dirconfigure找不到安装时,配置才会自动在/usr/local其他(可能是特定于平台的)“标准”位置中找到它。在你的情况下,我认为configure是在标准位置找到 libjpeg,并默默地忽略该指令。

(另外,PHP 5.3.13 已不再是当前版本,我建议使用 5.3.21,这是此时的当前版本。)

相关内容