Lua5.3编译C模块报multiple Lua VMs detected错误求解
报错核心原因
Windows平台下默认编译Lua主程序(exe)时不会导出内部的Lua API符号,你编译C模块时找不到对应符号就会被迫链接独立的Lua库,导致模块自带一套VM实例,和主程序的VM冲突,就会触发multiple Lua VMs detected报错。
解决步骤
1. 重新编译Lua 5.3.2主程序(必须和模块使用同一份Lua源码编译)
- 若使用MinGW/GCC编译主程序:
链接阶段增加-Wl,--export-all-symbols参数,让主程序导出所有Lua API符号,后续编译模块无需再链接-llua - 若使用VS2019编译主程序:
要么在编译时增加/EXPORT选项导出所有Lua相关符号,要么更简单直接把Lua编译为动态库(生成lua53.dll+导入库lua53.lib),主程序链接该导入库运行即可。
2. 调整C模块的编译配置
MinGW/GCC编译
不要加-llua参数,参考编译指令:
gcc -shared -o module.dll testlib.c -I[你的Lua5.3.2源码src目录路径] -Wl,--unresolved-symbols=ignore-in-object-files
模块加载时会自动从主程序中匹配已导出的Lua符号,不会额外引入第二套VM。
VS2019编译
- 若第一步是把Lua编译为动态库:模块仅需链接lua53.lib导入库,禁止链接Lua静态库
- 若第一步是编译为带导出符号的主程序exe:在VS链接器的「附加依赖项」中加入你的Lua主程序exe,不要额外链接Lua静态库
3. 运行验证
你现有的Lua加载代码不需要修改,重新编译模块后运行即可消除报错。
注意事项
- 必须保证模块和Lua主程序使用完全同版本的Lua源码编译,头文件版本不匹配也会触发符号异常
- 禁止同时把Lua静态库链接到主程序和模块中,这是触发双VM报错的最常见原因
内容的提问来源于stack exchange,提问作者Jewls
相关产品推荐
相关产品推荐

