我正在寻找一种便携式(POSIX)方式来确定使用dlopen()
打开的库的路径。 dl_iterate_phdr()
和dladdr()
等功能不可移植。
一些man
页面详细说明了dlopen()
查找要打开的库(ld.so.cache
,LD_LIBRARY_PATH
,/ lib,/ usr / lib,...)所采用的路径,因此检查所有这些目录可能是可能的,但不可移植。例如,在Linux下,我需要一种解析ld.so.cache
的方法,但在Mac OS X下,没有这样的概念。
请参阅previous question了解我为什么要这样做的详细信息,因为在一般情况下使用dlopen
是不明智的。
答案 0 :(得分:3)
没有任何方法可以做到你想要的便携。在没有绝对路径的情况下使用dlopen
可能是一个坏主意,并且除了用于加载dlopen
的模块之外的任何其他内容(由创建和分发的模块)使用它也是一个坏主意。使用您自己的项目本身或您的应用程序使用的其他库)。如果您将它与系统库搜索路径一起使用,那么库已经存在"在系统上,您运行严重的风险,加载错误的版本甚至错误的库具有相同的名称。只要您始终将绝对路径传递给dlopen
,就可以确定您确切地知道加载了哪个文件(或者更好的是,在加载之前确切知道将加载哪个文件 )。
如果这个答案没有帮助,也许你可以更好地解释你想要实现的目标......
答案 1 :(得分:2)
简单的答案是没有一个。这是一个地方 Windows早于Unix。