忽略LD_LIBRARY_PATH并坚持在链接时通过-rpath给出的库

时间:2010-03-09 10:13:22

标签: g++ dynamic-linking

我坐在一个我无法控制的环境中(这不仅仅是我,所以基本上,我无法改变环境,或者它不适合其他任何人),我唯一可以影响的事情是二进制文件的构建方式。

我的问题是,环境指定了一个包含libstdc ++的LD_LIBRARY_PATH,它与正在使用的编译器不兼容。我尝试静态编译它,但对于g ++来说这似乎是不可能的(版本4.2.3,似乎已经在以后的版本中在这个方向上完成了工作,虽然它们不可用,-static-libstdc ++或类似的东西)。 / p>

现在我已经到了使用rpath将绝对路径名称烘焙到可执行文件中(可以工作,它应该运行的所有机器都是相同的)。不幸的是,似乎LD_LIBRARY_PATH优先于rpath(重置LD_LIBRARY_PATH确认它能够找到库,但如上所述,LD_LIBRARY_PATH将为每个人设置,我无法改变它。)

有什么方法可以让rpath优先于LD_LIBRARY_PATH,还是有任何其他可能的解决方案来解决我的问题?请注意,我在谈论运行时的动态链接,我能够在编译和链接时控制命令行。

感谢。

2 个答案:

答案 0 :(得分:3)

也许你可以使用shell包装器来修改这个程序的环境?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

这应该在执行之前重载LD_LIBRARY_PATH,然后通过exec用二进制替换包装器。

这会有帮助吗?

答案 1 :(得分:1)

链接libstdc++.a绝对是可能的,尽管很棘手。说明here

我有点怀疑你声称LD_LIBRARY_PATH优先于“烘焙”DT_RPATH - 至少在Linux和(我相信)Solaris,LD_LIBRARY_PATH是仅在DT_RPATH查找失败后查看。