- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
获取由 /etc/ld.so.conf
配置的路径列表和其中包含的文件的最便携、最可靠的方法是什么?手动解析文件似乎不是一个好主意——格式可能会在未来的修订版中发生变化。
为了让大家更好的理解这个问题,下面我会给出具体的细节。请注意,尽管有这些细节,但这是一个通用的编程问题,适用于其他情况。
有一个程序,叫做LuaRocks .它是 Lua 编程语言的包管理器(有点像 Ruby gems 或 Python eggs)。 LuaRocks 包被称为“rocks”。
作为一个方便的功能,LuaRocks 允许摇滚作者为摇滚指定外部依赖列表,制定为 C 头文件和/或动态库文件的列表。 (.so on Linux。)如果指定的文件不存在,则无法安装rock。
目前,在 Linux 上,LuaRocks 默认通过在两个
hardcoded
路径 /usr/lib
和 /usr 中搜索文件来检查 .so 文件是否存在/本地/库
。
我认为这是不正确的行为,它是 broken通过最近changes在 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's How to write shared libraries .
关于linux - 如何在 Linux 上获取/etc/ld.so.conf 中的路径列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6653635/
我是一名优秀的程序员,十分优秀!