是否可以从代码中获取依赖库的位置
Posted
技术标签:
【中文标题】是否可以从代码中获取依赖库的位置【英文标题】:Is it possible to get location of dependent libraries from within code 【发布时间】:2019-01-03 10:25:21 【问题描述】:我想使用 dlopen 函数从我的程序中加载一些依赖库。是否有可能知道这些库的实际位置?
例如,ldd 显示系统中所有带有路径的依赖库。它是如何工作的?是否可以通过我的 C++ 代码中的一些调用获取我需要使用 dlopen 加载的对应库的路径?
【问题讨论】:
您要加载的是“已安装”的库吗? ldd 使用 LD_LIBRARY_PATH 获取所需库的路径,对于 dlopen,它可以位于文件系统上的任何位置。 是的。例如,它可能是我在某些时候并不总是需要的某种运行时库(例如 nvidia cuda)。 【参考方案1】:来自man dlopen
可以阅读:
函数 dlopen() 加载以 null 结尾的字符串文件名命名的动态库文件,并为动态库返回一个不透明的“句柄”。如果 filename 为 NULL,则返回的句柄用于主程序。如果文件名包含斜杠(“/”),则将其解释为(相对或绝对)路径名。否则,动态链接器按如下方式搜索库(有关详细信息,请参阅 ld.so(8)):
(仅限 ELF)如果调用程序的可执行文件包含 DT_RPATH 标记,但不包含 DT_RUNPATH 标记,则搜索 DT_RPATH 标记中列出的目录。
如果在程序启动时,环境变量
LD_LIBRARY_PATH
被定义为包含以冒号分隔的目录列表,则搜索这些目录。 (作为一项安全措施,对于 set-user-ID 和 set-group-ID 程序,此变量将被忽略。)(仅限 ELF)如果调用程序的可执行文件包含 DT_RUNPATH 标记,则搜索该标记中列出的目录。
检查缓存文件
/etc/ld.so.cache
(由 ldconfig(8) 维护)以查看它是否包含文件名条目。搜索目录
/lib
和/usr/lib
(按此顺序)。
因此,如果所需的库已“安装”,则只需一个简单的dlopen("foobar.so", flag)
。
【讨论】:
以上是关于是否可以从代码中获取依赖库的位置的主要内容,如果未能解决你的问题,请参考以下文章
使用 asm.js 将依赖于外部库的代码转换为 javascript
Android 中获取某个 dependencies 依赖库的最新版本小技巧