2

我坐在一个我无法真正控制的环境中(不仅仅是我,所以基本上,我无法改变环境,否则它对其他人不起作用),我唯一能影响的就是如何二进制文件已构建。

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

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

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

谢谢。

4

2 回答 2

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 将包装器替换为您的二进制文件。

这会有帮助吗?

于 2010-03-09T11:33:31.620 回答
1

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

我有点怀疑你的主张LD_LIBRARY_PATH优先于“烘焙” DT_RPATH——至少在 Linux 和(我相信)SolarisLD_LIBRARY_PATH上,只有在DT_RPATH查找失败后才会查看。

于 2010-03-10T07:51:58.550 回答