通过/etc/ld.so.conf
configuration的path列表以及包含的文件,获取path列表的最方便可靠的方法是什么? 手动parsing文件似乎不是一个好主意 – 格式可能会在将来的修订中改变。
为了更好地理解这个问题,我会在下面给你具体的细节。 请注意,尽pipe有这些细节,但这是一个普遍的编程问题,适用于其他情况。
有一个叫做LuaRocks的程序。 它是Lua编程语言的包pipe理器(有点像Ruby的gem或Python的蛋)。 LuaRocks包裹被称为“岩石”。
作为一个方便的function,LuaRocks允许一个摇滚作者指定一个摇滚的外部依赖列表,制定为C头文件和/或dynamic库文件列表。 (.so在Linux上。)如果指定的文件不存在,则无法安装Rock。
目前,在Linux上,LuaRocks默认通过在两个硬编码path/usr/lib
和/usr/local/lib
search文件来检查.so文件存在。
我相信这是不正确的行为,这是Ubuntu和其他Debian发行版中最近的变化所打破的。
更新:path本身不是硬编码的,但是在configuration文件中是用户可configuration的。 国际海事组织并不是最好的解决办法。
相反(据我所知),LuaRocks应该在由/etc/ld.so.conf
指定的path和它包含的文件中查找文件。
(现在请重新阅读上面的问题;-))
您不需要解析/etc/ld.so.conf或任何配置文件 – 如果您运行“ldconfig”,它将扫描配置的目录并生成缓存文件。
然后,当你尝试一个dlopen时,它会通过遍历缓存的库目录来自动找到这些文件。 编译和提供-lSomeLib也是如此,如果你已经在ld.so.conf(.d)中配置了它,你不需要指定-L / my / other /
autoconf通过尝试编译一个链接到共享库的测试程序来完成这个任务,但这只是dlopen()调用的功能包装。
所以,虽然其他方法可能不一定是“错误的”,但是试图链接到图书馆或者做一个dlopen()的根源是做这件事的“最正确的”方法。
考虑到这一点,如果你尝试链接到一个不在/etc/ld.so.cache中缓存的目录中的库,当你尝试运行该程序时,它将失败,因为它不能够使用dlopen()图书馆!
因此,任何'好的'共享库都将在/etc/ld.so.cache中,并且是可链接的/ dlopen(),这意味着gcc可以使用它来链接,用户生成的库或可执行文件将能够执行时打开它。
您可以通过明确地设置环境变量LD_LIBRARY_PATH或LD_PRELOAD_PATH来绕过这个问题,但是每个都有自己的注意事项,如果可能的话,应该避免使用“标准”。
编写共享库的一个很好的写法涵盖了其中的一些问题,对于任何其他共享库的程序化消费工作的读者来说都是一个很好的解读。 Ulrich Drepper的“如何编写共享库” 。
根据FHS ,以下是动态库的有效位置:
/lib*/ /opt/*/lib*/ /usr/lib*/ /usr/local/lib*/
(最有可能的是~/lib*/
)
我的/etc/ld.so.conf.d/*
所有条目都符合这个要求。 有些条目引用了FHS目录下的子目录,这可能意味着你可以使用那里没有路径信息的库。
现在我对LuaRocks还不够了解。 如果仅限于Lua路径样式(仅限于?
),则无法与这些匹配,必须解析配置。 否则,你可以尝试在这些目录中的任何地方找到它们。
这会在符合FHS的系统上失效(只有选项:解析配置),如果一个目录不包含在配置中,安装程序可能会看到链接器找不到的库。
这两个对我来说似乎是可以接受的,所以我简单的忽略了配置,看看这些dirs。
(另一种可能是尝试链接库,这应该自动地使用正确的路径,但这是平台特定的,也许是危险的。)