MALOUDA-PSA 2024-07-21 09:36 采纳率: 96.7%
浏览 2
已结题

skynet中lua和c++交互2

把lua-tbl.c 改为 lua-tbl.cpp, 加了 extern "C",可是还是报错:


./3rd/lua/lua: error loading module 'tbl.c' from file './tbl.so':
    dlopen(./tbl.so, 6): Symbol not found: __Z13luaL_setfuncsP9lua_StatePK8luaL_Regi
  Referenced from: ./tbl.so
  Expected in: flat namespace
 in ./tbl.so
stack traceback:
    [C]: in ?
    [C]: in function 'require'
    test/test-tbl.lua:3: in main chunk
    [C]: in ?
  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-21 09:36
    关注

    引自免费微信小程序:皆我百晓生

    这个问题看起来是在尝试在 C++ 和 Lua 之间进行交互时遇到的链接问题。错误提示表明在尝试加载模块 'tbl.c' 时,找不到特定的符号 __Z13luaL_setfuncsP9lua_StatePK8luaL_Regi。这个问题可能源于以下几个方面:

    1. 编译过程不一致:你可能在编译 Lua 模块和主程序时使用了不同的编译器或编译选项,导致生成的符号名称不一致。特别是当你使用 C++ 编译 Lua C API 相关的代码时,需要确保所有的编译单元都使用了相同的编译选项。
    2. 符号命名差异:在 C++ 中,编译的符号名称可能会因为名字修饰(name mangling)而与纯 C 代码的符号名称不同。即使你使用了 extern "C",也可能因为其他原因导致符号名称不匹配。
    3. 动态库与主程序的兼容性问题:确保你的动态库(tbl.so)是与你的主程序(可能是测试-tbl.lua)兼容的。这包括确保使用的 Lua 版本一致,以及任何依赖的库或头文件版本也保持一致。

    解决这个问题的步骤可能包括:

    • 确认编译选项:确保所有与 Lua 交互的 C++ 代码和纯 C 代码都是用相同的编译器和编译选项编译的。
    • 检查符号:检查生成的 tbl.so 是否真的包含了 __Z13luaL_setfuncsP9lua_StatePK8luaL_Regi 这个符号。可以使用工具如 nm(Linux 下)来查看动态库中的符号。
    • 重新构建:尝试清理你的构建环境并重新构建动态库和主程序。有时候旧的构建残留物可能会导致奇怪的问题。
    • 检查 Lua 版本:确保你使用的 Lua 版本与你的代码和动态库兼容。

    如果这些步骤仍然无法解决问题,可能需要更深入地检查具体的代码和构建过程。如果可以的话,提供有关你的编译环境、使用的编译器和选项、以及具体的代码片段,将有助于更准确地定位问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 已采纳回答 7月21日
  • 创建了问题 7月21日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?