【发布时间】:2013-07-29 00:56:43
【问题描述】:
我知道使用ldconfig 和LD_LIBRARY_PATH 的一般基础知识,但我希望能得到一些大师的帮助。
我有一个可移植的软件包,它驻留在自己的目录中,并且有许多库的自己的版本。
有许多二进制文件和脚本从这个目录运行。
一些二进制文件(apache、php、postgres)也可能在系统上安装了单独的版本。
由于可能有两个版本的 php,如果系统无法确定使用 ldconfig 文件的“myapp”版本,则创建 /etc/ld.so.conf.d/myapp.conf 是不够的。
我正在寻找配置此类系统的最佳实践。最初设置软件包的人导出了LD_LIBRARY_PATH,以便系统上的所有应用程序都使用它。
我正在尝试仅隔离包目录中的应用程序。
使用的一些参数:
/mypack - 包含软件包的所有内容
/mypack/local/lib - 包含可能与系统不兼容的所需库
库示例:
/mypack/local/lib/libz.so.1 => /mypack/local/lib/libz.so.1.2.3
/lib/libz.so.1 => /lib/libz.so.1.2.3
即使版本相同,/mypack 中的版本可能与发行版不兼容,如果使用它会破坏系统
二进制示例: php 存在于 /mypack 和默认目录中 /mypack 中的 php 应使用 /mypack/local/lib 中的库,发行版应使用 /lib
关于linux库路径的一些问题: - 是否可以指定/etc/ld.so.conf.d/php.conf 使其仅影响/mypack 中的php 版本? - 可以根据可执行文件的位置指定库路径吗?也就是说,在运行时,如果可执行文件的路径在 /mypack 下,它可以自动使用那里的库吗? - 每个用户怎么样?部分/大部分系统在不同的用户帐户上运行。如果我能够为每个用户设置不同的库路径,那就可以解决了。
【问题讨论】:
-
我认为典型的方法是使用包装脚本。包装脚本设置 LD_LIBRARY_PATH 的值,然后运行可执行文件。以 google-chrome 为例。
-
如果这是任何人想出的唯一方法,我会接受的。我已经通过这样做在 CentOS 中运行了 Chrome 28,但由于涉及的不同可执行文件的数量,我试图避免它。