Ale*_*ysh 4 linux debian lua shared-libraries ldd
什么是最便携,最健壮的方法来获取路径列表,/etc/ld.so.conf由它们配置和包含的文件?手动解析文件似乎不是一个好主意 - 格式可能会在将来的版本中发生变化.
为了更好地理解这个问题,我将在下面给出具体细节.请注意,尽管有这些细节,但这是一个通用编程问题,适用于其他情况.
有一个名为LuaRocks的程序.它是Lua编程语言的包管理器(有点像Ruby gems或Python eggs).LuaRocks包被称为"岩石".
作为一个便利功能,LuaRocks允许摇滚作者为摇滚指定外部依赖项列表,并将其表达为C头文件和/或动态库文件的列表.(.so在Linux上.)如果指定的文件不存在,则无法安装摇滚.
目前,在Linux上,默认检查LuaRocks通过搜索两个文件.so文件所有脑干硬编码路径,/usr/lib和/usr/local/lib.
我认为这是不正确的行为,并且最近Ubuntu和其他Debian发行版的更改打破了它.
更新:路径本身不是硬编码的,但在配置文件中是用户可配置的.仍然,IMO,不是最好的解决方案.
相反(据我所知),LuaRocks应该在路径中查找文件,由/etc/ld.so.conf它指定的文件和文件.
(现在请重新阅读上面的问题;-))
您不需要解析/etc/ld.so.conf或任何配置文件 - 如果运行'ldconfig',它将扫描配置的目录并生成缓存文件.
然后,当您尝试执行dlopen时,它将通过迭代缓存的库目录自动查找文件.编译和给出-lSomeLib也是一样的,如果你已经在ld.so.conf(.d)中配置了它,则不需要指定-L/my/other/path
autoconf通过尝试编译链接到共享库的测试程序来实现这一点,但这只是围绕dlopen()调用的功能包装器.
因此,虽然其他方法可能不一定是"错误的",但它的根源是尝试链接到库或执行dlopen()是"最正确"的方法.
考虑一下,如果您尝试链接到未在/etc/ld.so.cache中缓存的目录中的库,当您尝试运行该程序时,它将失败,因为它将无法执行dlopen()图书馆!
因此,任何"好"共享库都将位于/etc/ld.so.cache中并且可以链接/ dlopen(),这意味着gcc可以使用它来链接,并且用户生成的库或可执行文件将能够执行时打开它.
您可以通过明确设置环境变量LD_LIBRARY_PATH或LD_PRELOAD_PATH来规避这一点 - 但是每个都有它自己的警告,如果可能的话,应该避免使用"标准".
编写共享库的好文章涵盖了其中的一些问题,对于从事程序化消费其他共享库的人来说,这是一个很好的阅读.Ulrich Drepper的如何编写共享库.
| 归档时间: |
|
| 查看次数: |
9949 次 |
| 最近记录: |