我想要 dlopen() 特定目录中的每个共享库。为了做到这一点,
检索 linux 的库搜索路径的最干净的方法是什么。或者是否有更快的方法在该路径中查找特定目录?
posix 会更好。
最佳答案
POSIX 不支持在共享库搜索路径上查找目录的机制(例如,它不强制要求 LD_LIBRARY_PATH
),因此任何解决方案本质上都是特定于平台的。
Linux 存在一些问题,因为要使用的值可能基于 /etc/ld.so.conf
的内容以及 LD_LIBRARY_PATH
中的任何运行时值环境变量;其他系统存在类似的问题。默认位置也因系统而异 - /lib
和 /usr/lib
通常用于 32 位 Linux 机器,但 /lib64
和 /usr/lib64
至少在一些 64 位机器上使用。但是,其他平台将其他位置用于 64 位软件。例如,Solaris 使用 /lib/sparcv9
和 /usr/lib/sparcv9
(尽管文档提到了 /lib/64
和/usr/lib/64
,它们是指向 sparcv9
目录的符号链接(symbolic link))。 Solaris 还有环境变量 LD_LIBRARY_PATH_64
和 LD_LIBRARY_PATH_32
。 HP-UX 和 AIX 传统上使用 LD_LIBRARY_PATH
以外的其他变量——SHLIB_PATH
和 LIBPATH
,IIRC——尽管我相信 AIX 现在使用 LD_LIBRARY_PATH
也是。而且,在 Solaris 上,配置共享库的工具是“crle”(配置运行时链接环境),/etc/ld.so.conf
的模拟是 /var/ld/ld.config
或 /var/ld/64/ld.config
。当然,共享库的扩展也各不相同(.so
、.sl
、.dylib
、.bundle
等)。
因此,您的解决方案将特定于平台。您将需要决定默认位置、要读取的环境变量、要读取的配置文件以及相关的文件扩展名。鉴于这些,那么它主要是一个 SMOP - 简单的编程问题:
- 对于由任何来源命名的每个目录:
- 打开相关子目录(
opendir()
)- 依次读取每个文件名(
readdir()
) - 在相关文件的路径上使用
dlopen()
。 - 做任何与您相关的分析。
- 使用
dlclose()
- 依次读取每个文件名(
- 使用
closedir()
- 打开相关子目录(
另请参阅下面评论中的注释...完整的主题适度地充满了不同平台的变化。
关于c - 在共享库搜索路径中查找目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4213857/