如何从 Love2D 的子目录中获取共享对象文件 (nuklear.so)?

How to require a shared object file (nuklear.so) from a subdirectory in Love2D?

为了小游戏,我正在尝试love-nuklear library to create UIs. I've successfully built the .so by following the exact instructions provided by the author, see this section

nuklear.so 与我的 main.lua 文件放在同一目录时,nuklear = require('nuklear.so') 正确导入库,并且当我 运行 $ love ..

但是为了更好地组织,我决定将 nuklear.so 移动到子目录 lib/ 中,其中还导入了其他 lua 模块。但是现在在main.lua,使用nuklear = require('lib.nuklear')的时候,那么在项目根目录下运行ning $ love .,就会产生如下错误:

Error: error loading module 'lib.nuklear' from file './lib/nuklear.so':
        ./lib/nuklear.so: undefined symbol: luaopen_lib_nuklear
stack traceback:
        [string "boot.lua"]:637: in function <[string "boot.lua"]:633>
        [C]: at 0x7ff27837fc00
        [C]: in function 'require'
        main.lua:4: in main chunk
        [C]: in function 'require'
        [string "boot.lua"]:475: in function <[string "boot.lua"]:311>
        [C]: in function 'xpcall'
        [string "boot.lua"]:645: in function <[string "boot.lua"]:639>
        [C]: in function 'xpcall'

我应该如何正确地将我的共享对象从项目根目录重定位到它的 lib/ 子目录?

默认情况下,加载 C 库时,Lua 在名为 luaopen_x 的库中查找一个函数,其中 x 是模块名称,其中 . 替换为_(以及其他一些转换),然后运行它。 (参见 documentation for package.searchers。)在这种情况下,模块名称 lib.nuklear 导致函数名称 luaopen_lib_nuklear。但是该函数实际上被命名为luaopen_nuklear,所以Lua没有找到它并且无法加载库。

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

获取 nuklear.so 的源代码并将 luaopen_nuklear 重命名为 luaopen_lib_nuklear 并重新编译也可以,但是有点傻,并且不能解决其他 C 的问题同一目录中的库。