从相对于加载可执行文件的目录加载.so
Load .so from directory relative to loading executable
由于各种原因,主要与惯性有关,我们没有make install
目标。
相反,我们直接将大型c++代码库构建为类似fhs的树;
output/
bin/
lib/
etc/
...
我们最近将一些第三方库切换为动态链接,因此我们将一些.so
库推送到lib/
。
现在,我们习惯于能够从bin/
启动可执行文件,但这不再工作,因为加载器不搜索我们的lib/
目录。
LD_LIBRARY_PATH
可以解决这个问题,但是我们不希望在每次可执行调用之前提供它,我们也不想把它粘在shell的环境中,因为我们通常在同一个shell中在许多不同的构建树之间切换。
我们考虑过在生成的ELF中添加rpath
条目,但是相对路径通常是针对$PWD
解析的,而不是针对可执行文件的dirname。
是否有一种方法可以推动加载器在dirname(argv[0])/../lib
中查找.so lib ?
基本上,我知道有很多方法可以改变我们的习惯,使它工作(也许应该),但我们不喜欢在这一点上,所以我们可以强迫Linux so加载器做我们想要的吗?谢谢!
是的,可以使用rpath
和${ORIGIN}
宏,它们在运行时被ld.so
识别。
From 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++错误:libopencv_ximgproc.so.4.4
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 加载共享库时出错:libbsoncxx.so._noabi:无法打开共享对象文件:没有此类文件或目录
- 如何更改路径以修复错误"./main:加载共享库 libmkl_core.so 时出错?
- 使用 jna 加载 lib .so
- C++调用lua_dostring来加载具有"require('cjson')"的Lua Scrip引发错误:cjson.so:未定义的符号:lua_getfield
- 加载共享库时出现"错误:libSDL2_mixer-2.0.so.0:无法打开共享对象文件:没有这样的文件或目录
- 来自Pascal DLL/SO中的C 加载和调用功能
- java.lang.UnsatisfiedLinkError: dlopen failed: 无法加载"libPrivateSsl.so"所需的库"libcrypto.so.1.0.0";
- Android本机运行时无法加载符号,即使它们实际上是在加载的.so文件中找到的
- 加载共享库时的错误:libgsl.so.0:无法打开共享对象文件:没有这样的文件或目录
- RedHatLinux :是否可以以编程方式加载 libcert.so 共享对象
- 加载共享库时出错:libQt5Multimedia.so.5:无法打开共享对象文件:没有这样的文件或目录
- 在Python脚本中加载.SO文件时未定义的符号错误
- 加载共享库时出错:libsystemc-2.3.0.so
- 加载共享库时出现thrax编译器错误:libthrax.so.0
- 在运行时加载 .so 的 C++ 静态强制转换
- 加载.so文件在一些安卓设备上崩溃
- 从相对于加载可执行文件的目录加载.so
- 正在加载.so库