对于一个小游戏,我正在试用爱-核库来创建UI。我按照作者提供的确切说明(请参阅.so )成功地构建了本节。
当nuklear.so放置在与我的main.lua文件相同的目录中时,nuklear = require('nuklear.so')将正确导入库,并在运行$ love .时可以访问。
然而,为了更好的组织,我决定将nuklear.so移到一个子目录lib/中,在那里还导入了其他lua模块。但是现在在main.lua中,当使用nuklear = require('lib.nuklear'),然后在项目根目录中运行$ 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/子目录?
发布于 2019-09-14 00:10:30
默认情况下,加载C库时,Lua会在名为luaopen_x的库中查找一个函数,其中x是模块名,.被_替换(以及其他一些转换),并运行它。(参见package.searchers。)在本例中,模块名lib.nuklear导致函数名luaopen_lib_nuklear。但是这个函数实际上名为luaopen_nuklear,所以Lua找不到它,也无法加载库。
要解决这个问题,可以在加载带有./lib/?.so:package.cpath = package.cpath .. ";./lib/?.so"的库之前将require "nuklear":package.cpath = package.cpath .. ";./lib/?.so"添加到package.cpath中。然后Lua将寻找luaopen_nuklear in ./lib/nuklear.so。这将允许您在该目录中加载其他.so库。
获取nuklear.so的源代码并将luaopen_nuklear重命名为luaopen_lib_nuklear和重新编译也是可行的,但这有点愚蠢,也解决不了同一个目录中其他C库的问题。
https://stackoverflow.com/questions/57925114
复制相似问题