因此,我正在处理的项目使用非系统目录来保存代码使用的一些 DLL。我不想将它们放在系统目录中,因此可执行文件设置了一个 rpath 来查找 DLL。但是,随着越来越多的库被添加,现在有依赖于该目录中其他 DLL 的 DLL。
这些库找不到它们所依赖的 DLL,因为它们不在链接器正在寻找的目录中,例如系统目录。
有没有办法让 DLL 搜索这个特定的非系统目录?比如rpath?图书馆是如何做到的?用于该项目的构建系统是 CMake,如果这有助于答案。
这个答案不起作用,因为库中没有 rPath 标签:https ://unix.stackexchange.com/a/272286/4193
我考虑过使用LD_LIBRARY_PATH
, 并且可行,但是打字很烦人,而且让其他人使用该应用程序并不是那么好。如果有办法将rPath
标签添加到库中,那将是最好的选择。
指向以前相关问题和答案的指针表示赞赏。
就在这里。您可以
-Wl,-rpath
像使用 ELF 可执行文件一样使用 ELF 共享对象。克隆我在 这里提出的一个小例子:运行
make
编译。检查main
ELF 可执行文件需要哪些库:并检查需要哪些库
libtwo.so
:如您所见,两者都
main
需要libtwo.so
一些共享对象,并且都设置了 rpath。您无需设置 LD_LIBRARY_PATH 即可运行 ./main:main 将始终在
.
当前目录中查找其 libtwo.so 依赖项,而 libtwo.so 反过来将始终在libs
目录中查找其 libone.so 依赖项。如果libs
缺少 ./main 将无法启动:恢复它:
由于您不想将其视为系统的一部分,因此请按原样使用它;一个用户应用程序!
如果你添加
~/.local/lib/
到你的LD_LIBRARY_PATH
,你可以把所有的东西都放在那里。只需在bin~/.local/
等lib和share下创建部分FHS结构。这样您就不需要使用前面的环境变量调用程序。所有其他系统只需要将此目录附加到它们的库路径环境变量中。非常整洁和unixish。如果您也拒绝此解决方案,则只剩下一种可能性。您要么使用每个系统都需要的固定路径,要么使用包含路径并且也是预期的环境变量。