[英]Linker not finding dependency of Lua C Module
所以我有点不知所措,不知所措。
问题:我制作了一些 lua C 模块,它针对另一个包的 C++ 共享库。 由于依赖性问题,尝试要求 Lua 模块失败。 我可以很好地找到模块共享库,但是当 linker 试图找到我需要链接的库时,我收到如下错误:
/usr/bin/lua: error loading module 'mytest' from file '/usr/lib/lua/5.3/mytest.so':
Error loading shared library libmy_test.so: No such file or directory (needed by /usr/lib/lua/5.3/mytest.so)
用于链接的目录结构是
|-usr
|--lib
|---lua
|----5.3
|-----mytest.so
|-mockfs
|--usr
|---lib
|----libmy_test.so
我的 LUA_CPATH 是:
/usr/lib/lua/5.3/?.so;/mockfs/usr/lib/?.so;
我的 LD_LIBRARY_PATH 是:
/mockfs/usr/lib/
让我发疯的是,当libmy_test.so
与mytest.so
位于同一目录时,没有问题。 但由于其他限制,我无法修改libmy_test.so
的路径或添加符号链接,而无需大量重构和构建/回归的滞后时间。 我不确定在这里甚至在哪里继续,因为这绝对是一个“搜索图书馆”的问题,但我不知道如何深入了解幕后发生的事情来解决这个问题。
添加/mockfs/usr/lib/?.so
到LUA_CPATH
不会有帮助,因为它只适用于加载了require
的 Lua 模块(它已经适用于你的情况mytest.so
)并且不适用于加载它们的依赖项(应该使用动态链接处理)。
目前尚不清楚您的情况是否甚至使用了LD_LIBRARY_PATH
; 我会设置LD_DEBUG=all
以获取LD
故障排除信息,它应该告诉您加载或未加载的内容以及原因。
此外,即使您不能将mytest.so
放在libmy_test.so
所在的位置,您仍然可以将 mytest.so 放在mytest.so
所在的libmy_test.so
并配置LUA_CPATH
,就像您必须尝试使其那样工作一样。
所以这将与其他人的 Lua 代码无关。 这个问题描述有点脱离现实,因为它前面有我公司的很多内部工具。 我按照 Paul 的回答尝试获取更多信息,LD_DEBUG 一直在运行,直到我调用我的 Lua 脚本。 然后 linker 将停止给我任何信息,即使 require 仍然失败并出现相同的错误。
经过大量挖掘和我对strace
的个人发现后,我设法确定调用require
时使用的 linker 实际上是使用“LD_PATH”而不是“LD_LIBRARY_PATH”来搜索库。 这是为什么? 除了在进行交叉编译时可能是为了克服我们内部工具的一些局限性而做出的有意的设计决定外,我仍然一无所知。
对于遇到 linker 问题和 Lua 问题的任何人,LD_DEBUG 和 strace 是解决问题的非常好的实用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.