VS2022 C++单元测试LNK2019/LNK1120链接错误问题求助
C++单元测试链接错误排查方案
核心错误:LNK2019未解析外部符号、LNK1120链接失败
该错误由两个问题共同导致:
- 头文件引用方式错误
测试文件ChessTest.cpp中使用#include <MetaData.h>包含自定义头文件是错误写法。尖括号仅用于引用标准库、系统库或已配置全局包含路径的第三方库头文件,项目内自定义头文件必须使用双引号引用:// 错误写法 #include <MetaData.h> // 修正后 #include "MetaData.h" - 单元测试项目未关联主项目编译产物
独立创建的原生单元测试项目默认不会自动链接主项目(ChessProject)的目标文件,即使头文件声明能被正确识别,链接阶段也找不到MetaData.cpp中实现的函数,触发未解析符号错误。
修正操作:- 右键测试项目,选择「添加」→「引用」,在弹窗中勾选主项目
ChessProject后确认。 - 若上述操作后仍报错,右键测试项目打开属性页:
- 在「C/C++→常规→附加包含目录」中添加主项目存放
MetaData.h的文件夹路径 - 在「链接器→输入→附加依赖项」中添加主项目编译输出目录下对应架构(x64/Debug)的
ChessProject.lib文件路径
- 在「C/C++→常规→附加包含目录」中添加主项目存放
- 右键测试项目,选择「添加」→「引用」,在弹窗中勾选主项目
警告:C26812 未使用 scoped enum
该警告是静态代码检查提示,当前代码使用的是C风格无作用域枚举,枚举值会直接暴露在当前作用域,易引发命名冲突。按照提示将普通enum改为enum class即可,现有代码中ChessColor::Black这类带枚举名的引用写法无需修改:
// MetaData.h中修改枚举定义 enum class ChessColor { White, Black }; enum class PieceType { King, Queen, Rook, Bishop, Knight, Pawn, None };
可选代码优化
当前工具函数均使用枚举指针作为参数,无实际意义:枚举是轻量值类型,直接传值性能更好,还能彻底避免空指针非法访问风险。修改方式:
- 头文件中把所有函数参数的指针符号
*去掉 - 对应cpp实现中,把switch语句里的解引用操作
*type/*color直接改为type/color - 测试代码调用时去掉取地址符
&,直接传入枚举变量即可
内容的提问来源于stack exchange,提问作者Bambous
相关产品推荐
相关产品推荐

