使用dlopen确定打开动态库路径的便携方式

时间:2012-02-06 16:02:08

标签: c++ c posix shared-libraries dlopen

我正在寻找一种便携式(POSIX)方式来确定使用dlopen()打开的库的路径。 dl_iterate_phdr()dladdr()等功能不可移植。

一些man页面详细说明了dlopen()查找要打开的库(ld.so.cacheLD_LIBRARY_PATH,/ lib,/ usr / lib,...)所采用的路径,因此检查所有这些目录可能是可能的,但不可移植。例如,在Linux下,我需要一种解析ld.so.cache的方法,但在Mac OS X下,没有这样的概念。

请参阅previous question了解我为什么要这样做的详细信息,因为在一般情况下使用dlopen是不明智的。

2 个答案:

答案 0 :(得分:3)

没有任何方法可以做到你想要的便携。在没有绝对路径的情况下使用dlopen可能是一个坏主意,并且除了用于加载dlopen的模块之外的任何其他内容(由创建和分发的模块)使用它也是一个坏主意。使用您自己的项目本身或您的应用程序使用的其他库)。如果您将它与系统库搜索路径一起使用,那么库已经存在"在系统上,您运行严重的风险,加载错误的版本甚至错误的库具有相同的名称。只要您始终将绝对路径传递给dlopen,就可以确定您确切地知道加载了哪个文件(或者更好的是,在加载之前确切知道将加载哪个文件 )。

如果这个答案没有帮助,也许你可以更好地解释你想要实现的目标......

答案 1 :(得分:2)

简单的答案是没有一个。这是一个地方 Windows早于Unix。