如何在Linux上获取/etc/ld.so.conf中路径列表
什么是最便携且稳健的方式来获取由/etc/ld.so.conf
配置的路径列表以及从中包含的文件?手动解析文件似乎不是一个好主意-在未来的版本中,格式很可能会改变。
为了更好地理解问题,我给您以下具体细节。请注意,尽管有这些细节,这是一个通用的编程问题,适用于其他情况。
有一个名为LuaRocks的程序。它是Lua编程语言的软件包管理器(有点像Ruby gems或Python eggs)。LuaRocks程序包称为"rocks"。
作为一项便利功能,LuaRocks允许rock作者指定一个外部依赖项列表,这些依赖项被公式化为C头文件和/或动态库文件的列表。 (在Linux上为.so文件。)如果指定的文件不存在,则无法安装rock。
目前,在Linux上,默认情况下,LuaRocks通过在两个硬编码路径/usr/lib
和/usr/local/lib
中搜索文件来检查.so文件是否存在。
我认为这是不正确的行为,由于Ubuntu和其他Debian发行版的最近更改,这是破碎的。
更新:路径不是硬编码的,而是在配置文件中可以配置的。仍然,我认为这不是最好的解决方案。
相反(就我所理解的),LuaRocks应该在/etc/ld.so.conf
及其包含的文件指定的路径中查找文件。
(现在请重新阅读上面的问题;-))
原文链接 https://stackoverflow.com/questions/6653635
你不需要解析 /etc/ld.so.conf 或任何配置文件 - 如果你运行 'ldconfig',它会扫描配置的目录并生成一个缓存文件。
然后,当你尝试 dlopen 时,它会通过迭代缓存的库目录自动找到文件。如果在 ld.so.conf(.d) 中进行了配置,那么在编译并使用 -lSomeLib 进行链接时,你不需要指定 -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。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
根据FHS规范,动态库的有效位置如下:
/lib*/ /opt/*/lib*/ /usr/lib*/ /usr/local/lib*/
(很可能也包括
~/lib*/
。)我的
/etc/ld.so.conf.d/*
中的所有条目都符合此规范。一些条目引用了FHS目录下的子目录,这可能意味着您可以在其中使用这些库而不需要路径信息。我对LuaRocks的了解不够。如果您只限于Lua-path-style的通配符(仅
?
),则无法匹配这些通配符,并且必须解析配置文件。否则,您可以尝试在这些目录中的任何位置找到它们。这将在非FHS一致的系统上中断(唯一选项:解析配置文件),并且如果目录未包含在配置文件中,则安装程序可能会看到链接器找不到的库。
这两个选项对我来说似乎可接受,因此我只需忽略配置并查看这些目录。
(另一种可能是尝试链接库,这应该自动使用正确的路径。但是,这是特定于平台的,可能是危险的。)