Visual Studio 2019编译Protobuf C++示例出现LNK2019链接错误如何解决
error LNK2019: unresolved external symbol "public: bool __cdecl google::protobuf::MessageLite::ParseFromArray(void const *,int)" (?ParseFromArray@MessageLite@protobuf@google@@QEAA_NPEBXH@Z) referenced in function "void __cdecl ReceiveRequest(bool *)"
解决方案
- 检查编译架构一致性
确认Protobuf静态库编译时的目标架构(x86/x64)和业务项目的目标架构完全匹配,二者架构不同会直接导致符号无法识别。 - 检查运行库选项匹配
两者的运行库选项(项目属性 → C/C++ → 代码生成 → 运行库)必须完全一致,不允许交叉混用:- Debug版本对应
多线程调试DLL(/MDd)或多线程调试(/MTd) - Release版本对应
多线程DLL(/MD)或多线程(/MT)
- Debug版本对应
- 检查预处理器宏定义一致性
业务项目的预处理器定义必须和编译静态库时的定义完全对齐,重点校验两个宏:- 若编译静态库时定义了
PROTOBUF_USE_DLLS,业务项目也必须添加该宏,反之则不能添加 - Debug版本需同步定义
PROTOBUF_DEBUG宏,Release版本需同步取消该宏定义
- 若编译静态库时定义了
- 检查静态库依赖配置
确认项目附加依赖项中已经添加了对应版本的Protobuf静态库,且没有混用Debug和Release版本的库文件:- Debug版本添加
libprotobufd.lib - Release版本添加
libprotobuf.lib
- Debug版本添加
- 检查头文件与库版本一致性
业务项目引入的Protobuf头文件版本,必须和编译静态库使用的Protobuf源码版本完全一致,头文件与库版本不匹配会导致符号声明和导出实现不对应。
内容的提问来源于stack exchange,提问作者ree
相关产品推荐
相关产品推荐

