如何在Love2D的子目录中要求共享对象文件(nuklear.so)?

对于一个小游戏,我正在尝试使用love-nuklear库创建UI。我按照作者提供的确切说明成功构建了.so,参见这个部分

当将“nuklear.so”放置在与我的“main.lua”文件相同的目录中时,“nuklear = require('nuklear.so')”正确导入库,并且在运行“$ love。”时可以访问。

但是为了更好的组织,我决定将“ nuklear.so” 移动到一个子目录“lib /”中,在那里还导入了其他lua模块。但现在在main.lua中使用nuklear = require('lib.nuklear')时,然后在项目根目录中运行“$ love。”,将产生以下错误:

错误:从文件'./lib/nuklear.so'加载模块'lib.nuklear'时出错:
 ./lib/nuklear.so:未定义的符号:luaopen_lib_nuklear
 stack traceback:
 [string“boot.lua”]:637:在函数<[string“boot.lua”]:633>中
 [C]:在0x7ff27837fc00处
 [C]:在函数'require'中
 main.lua:4:在主块中
 [C]:在函数'require'中
 [string“boot.lua”]:475:< [string“boot.lua”]:311>
 [C]:在函数'xpcall'中
 [string“boot.lua”]:645:< [string“boot.lua”]: 639>
 [C]:在函数'xpcall'

我应该如何正确地将共享对象从项目根目录重新定位到其“lib /”子目录中?

点赞
用户9383219
用户9383219

默认情况下,当加载一个 C 库时,Lua 在库中寻找一个名为 luaopen_x 的函数,其中 x 是模块名,并将 . 替换为 _(以及进行一些其他转换),然后运行它。(详见package.searchers的文档。)在这个例子中,模块名 lib.nuklear 导致函数名为 luaopen_lib_nuklear。但实际上函数名是 luaopen_nuklear,所以 Lua 找不到它,无法加载库。

要解决这个问题,可以在使用 require "nuklear" 加载库之前将 ./lib/?.so 添加到 package.cpath 中:package.cpath = package.cpath .. ";./lib/?.so"。然后 Lua 将在 ./lib/nuklear.so 中寻找 luaopen_nuklear。这将允许您加载该目录中的其他 .so 库。

获取 nuklear.so 的源代码并将 luaopen_nuklear 重命名为 luaopen_lib_nuklear,然后重新编译也可以解决问题,但这有点儿愚蠢,并且不能解决该目录中其他 C 库的问题。

2019-09-14 00:10:30