如何从 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.cpath
:package.cpath = package.cpath .. ";./lib/?.so"
。然后Lua会在./lib/nuklear.so
中寻找luaopen_nuklear
。这将允许您在该目录中加载其他 .so
库。
获取 nuklear.so
的源代码并将 luaopen_nuklear
重命名为 luaopen_lib_nuklear
并重新编译也可以,但是有点傻,并且不能解决其他 C 的问题同一目录中的库。
为了小游戏,我正在尝试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.cpath
:package.cpath = package.cpath .. ";./lib/?.so"
。然后Lua会在./lib/nuklear.so
中寻找luaopen_nuklear
。这将允许您在该目录中加载其他 .so
库。
获取 nuklear.so
的源代码并将 luaopen_nuklear
重命名为 luaopen_lib_nuklear
并重新编译也可以,但是有点傻,并且不能解决其他 C 的问题同一目录中的库。