VS2019嵌入Lua时longjmp崩溃 换C++编译出现LNK2019未解析符号问题
问题核心原因
你遇到的LNK2019错误是符号不匹配导致的:
- Lua源码默认是C语言实现,加入VS项目后默认按C编译器编译,生成的函数符号是无C++名称修饰的C链接符号
- 你去掉
extern "C"包裹引入Lua头文件后,C代码中的Lua函数声明会生成带C名称修饰的符号,和Lua源码编译出来的C链接符号无法匹配,所以提示符号未解析 - 另外你只改头文件引用方式是没用的,Lua源码本身如果按C编译,依然会使用longjmp的实现,达不到替换为C++异常的效果
解决方案
按以下步骤操作即可同时解决链接错误和longjmp崩溃的问题:
1. 修改Lua源码的编译模式
- 在VS解决方案资源管理器中,选中所有加入项目的Lua .c源文件(含lapi.c、lauxlib.c等全部Lua官方源码文件)
- 右键选择「属性」,先将顶部的配置、平台选项改为你当前使用的版本(也可以选择「所有配置」「所有平台」避免后续切换配置重复修改)
- 依次展开
配置属性 > C/C++ > 高级,找到「编译为」选项,将默认的「编译为 C 代码 (/TC)」修改为「编译为 C++ 代码 (/TP)」,保存设置。
2. 调整预处理器宏
- 右键项目名称选择「属性」,展开
配置属性 > C/C++ > 预处理器 - 检查「预处理器定义」列表,确认没有
LUA_USE_LONGJMP宏定义,如果有就删除该条目,确保Lua编译时会命中C++异常的逻辑分支。
3. 统一头文件引用规则
- 项目内所有引用Lua头文件的位置,都不要用
extern "C"包裹,确保C编译器识别到的Lua函数声明和Lua源码编译生成的C链接符号完全匹配。
验证
完成上述修改后清理并重新生成整个项目,LNK2019错误会消失,同时Lua报错时会抛出C++异常而非执行longjmp,不会再触发进程崩溃问题。
内容的提问来源于stack exchange,提问作者ayya
相关产品推荐
相关产品推荐

