获取c++ (linux)中的动态库目录
Get dynamic library directory in c++ (linux)
是否有任何可编程的方式来获取由程序加载的动态库的位置?
我知道有可能得到'可执行'的运行路径。但这对我来说还不够。
我正在开发一个外部库,它有一些依赖关系,我需要相应地指向它的位置。
例如,程序运行在:
/local/deepLearning/bin
这个程序使用位于:
的动态库/local/external/libs/faciesAnalysis
我需要的是,在运行时,字符串
"/local/external/libs/facesAnalysis"
我在linux上工作,有什么建议吗?
因为这是特定于Linux的,dladdr()
是dl
系列函数的glibc扩展,它将查找任何符号的文件名。把你所知道的存在于你正在寻找的库中的任何函数的地址传递给它,你基本上就完成了。
没有适当的错误检查:
#define _GNU_SOURCE
#include <dlfcn.h>
const char *my_fname(void) {
Dl_info dl_info;
dladdr((void*)my_fname, &dl_info);
return(dl_info.dli_fname);
}
首先(这是特定于Linux的,因为是由内核提供的),您可以从程序内部解析/proc/self/maps
伪文件。只要按顺序读取该文本文件的每一行,就可以获得每个mmap
-ed文件的完整路径,包括共享库。请参阅proc(5)(并使用dirname(3)从路径中获取目录,也可以使用realpath(3)…)。阅读也打开(3)&ld-linux.so(8)并注意LD_LIBRARY_PATH
和/etc/ld.so.conf
的作用
然后,这是特定于GNU libc的(但显然musl-libc也有),您可以对该库中的某些函数地址使用dladdr(3)。或者直接使用dl_iterate_phdr(3),它看起来完全符合您的问题。
小心奇怪的情况:一些程序可能会生成一个插件,然后dlopen
(我的MELT就是这样做的),一些其他程序可能会在dlopen
之后remove
一个插件,一些程序可能是静态链接的,dlopen
-ed插件可能已经被移动或重命名(也许是因为当你的程序正在运行时已经安装了一个新版本)…,同样的插件可以使用不同的路径进行符号链接和展开,等等…
阅读Drepper的论文:如何编写共享库
您可以获得可执行文件(std::string path_and_exe
)的完整路径,然后执行以下命令:
#include <cstdlib>
std::string output("output.txt");
system ("ldd " + path_and_exe + " > " + output);
// read libray paths from output file
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- 在c++中使用动态分配的问题
- C++中的动态对象与非动态对象
- 如何在动态数组上使用搜索函数
- 视觉studo 2019中的漫画和静态/动态绑定
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁