我坐在一个我无法控制的环境中(这不仅仅是我,所以基本上,我无法改变环境,或者它不适合其他任何人),我唯一可以影响的事情是二进制文件的构建方式。
我的问题是,环境指定了一个包含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,还是有任何其他可能的解决方案来解决我的问题?请注意,我在谈论运行时的动态链接,我能够在编译和链接时控制命令行。
感谢。
答案 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
查找失败后查看。