正确使用LD_LIBRARY_PATH或ldconfig作为软件包

时间:2013-07-29 00:56:43

标签: linux ld

我知道使用ldconfigLD_LIBRARY_PATH的一般基础知识,但我希望有一个小大师帮助解决我的情况。

我有一个可移植的软件包,它位于自己的目录中,并拥有自己的许多库版本。

从该目录运行有许多二进制文件和脚本。

某些二进制文件(apache,php,postgres)也可能在系统上安装了单独的版本。

由于可能有两个版本的php,如果系统无法确定哪个版本的“myapp”使用ldconfig文件,则创建/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的libs,发行版版本应该使用/ lib

关于linux库路径的一些问题:   - 是否可以指定/etc/ld.so.conf.d/php.conf,使其仅影响/ mypack中的php版本?   - 可以根据可执行文件的位置指定库路径吗?也就是说,在运行时,如果可执行文件的路径在/ mypack下,它是否可以自动使用库?   - 每个用户如何?部分/大部分系统在不同的用户帐户上运行。如果我能够为每个用户设置不同的库路径,那将解决它。

2 个答案:

答案 0 :(得分:5)

如果其他人发现这个有用,我最终会在构建之前执行此操作:

export LD_RUN_PATH='$ORIGIN/../lib'

这包括二进制本身中的库路径,相对于二进制文件的位置。如果您计划在bash脚本或构建文件中使用它,请确保使用$ ORIGIN查找您的特定用法,因为在某些情况下您需要执行类似\ $$ ORIGIN,\ $$ ORIGIN或$$的操作ORIGIN,以便构建中涉及的不同实用程序可以正确地转义美元符号。找到这个有用的位使我不得不更新大约50个单独的脚本,这些脚本作为批处理来构建我们的软件包。

答案 1 :(得分:0)

一般来说,问题是LD_LIBRARY_PATH位于ldconfig提供的信息之前。如果您只想拥有一组备份库以便在尚未拥有它们的系统上安装,请从ldconfig中提取当前的库集并将它们添加到LD_LIBRARY_PATH

Layer layer = (Layer)generator
    .generateBlock(ltype, x, y)
    .newInstance();
layer.init(ltype, x, y);