我正在我的服务器上编译 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]
(在许多情况下,只使用附加LDFLAGS
到configure
命令,但 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-dir
当configure
找不到安装时,配置才会自动在/usr/local
其他(可能是特定于平台的)“标准”位置中找到它。在你的情况下,我认为configure
是在标准位置找到 libjpeg,并默默地忽略该指令。
(另外,PHP 5.3.13 已不再是当前版本,我建议使用 5.3.21,这是此时的当前版本。)