是否可以从代码中获取依赖库的位置

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 依赖库的最新版本小技巧

Android 中获取某个 dependencies 依赖库的最新版本小技巧

Android下查看SO库的依赖

原生库的 Android AAR 包

如何分发带有依赖库的 Mac OS X?