首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从nuklear.so的子目录中要求共享对象文件( Love2D )?

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

Stack Overflow用户
提问于 2019-09-13 14:02:25
回答 1查看 192关注 0票数 1

对于一个小游戏,我正在试用爱-核库来创建UI。我按照作者提供的确切说明(请参阅.so )成功地构建了本节

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

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

代码语言:javascript
复制
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/子目录?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-14 00:10:30

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

要解决这个问题,可以在加载带有./lib/?.sopackage.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库的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57925114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档