gpt4 book ai didi

c++ - 从相对于加载可执行文件的目录加载 .so

转载 作者:太空宇宙 更新时间:2023-11-04 09:29:32 27 4
gpt4 key购买 nike

由于各种原因(主要是惯性),我们没有 make install 目标。

相反,我们将大型 C++ 代码库直接构建到类似 FHS 的树中;

output/
bin/
lib/
etc/
...

我们最近将一些第三方库切换为动态链接,因此我们将一些.so 库推送到lib/

现在,我们习惯于从 bin/ 启动我们的可执行文件,但这不再有效,因为加载器不搜索我们的 lib/目录。

LD_LIBRARY_PATH 可以解决这个问题,但我们不希望在每次调用可执行文件之前都提供它,我们也不想将它保留在 shell 环境中,因为我们通常会在两者之间切换在同一个 shell 中有许多不同的构建树。

我们考虑过在生成的 ELF 中添加一个 rpath 条目,但相对路径通常是根据 $PWD 解析的,而不是可执行文件的目录名。

有没有办法让加载程序在 dirname(argv[0])/../lib 中查找 .so 库?

基本上,我知道有很多方法可以改变我们的习惯来完成这项工作(而且可能应该),但我们现在不想这样做,所以我们可以强制 Linux 加载器做我们想做的事吗?谢谢!

最佳答案

是的,可以使用 rpath${ORIGIN} 宏,它在运行时被 ld.so 识别。

来自man ld.so:

ld.so understands certain strings in an rpath specification 
(DT_RPATH or DT_RUNPATH); those strings are substituted as follows

$ORIGIN (or equivalently ${ORIGIN})
This expands to the directory containing the application executable.

更多变量可用。您不需要强制加载程序执行任何操作。它具有适合您的功能。 :)

关于c++ - 从相对于加载可执行文件的目录加载 .so,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33110591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com