在windows下使用protobuf,编译成dll,在使用中提示下面错误( unresolved external symbol
?empty_string_once_init_@internal@protobuf@google@@3HA (int google::protobuf::internal::empty_string_once_init_),
?empty_string_@internal@protobuf@google@@3PBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@B (class std::basic_string,class std::allocator> const * const google::protobuf::internal::empty_string_)
提示这两个函数,而通过用dumpbin 查看libprotobufd.dll,其中导出了这两个函数,最后在这里找到
需要在引用这个dll的工程中加入宏 PROTOBUF_USE_DLLS,通过搜索protobuf工程,发现定义这个宏之后,添加这个宏之后,会有下面的宏定义:
#define LIBPROTOBUF_EXPORT__declspec(dllimport)
有可能在加入pb之后,你的工程出现数百个未定义的类型,而明显在你的项目中,这些都是有定义的,这个时候,你可以考虑把pb消息的头文件添加到其他头文件之前
默认生成的xxx.pb.h,xxx.pb.cc的类在windows下都是没有_dllexport符号修饰,所以不可以在生成的dll中导出使用,可以通过 `protoc --cpp_out=dllexport_decl=MY_EXPORT_MACRO:path/to/output/dir myproto.proto`来实现为所有的类添加`MY_EXPORT_MACRO`修饰符。然后在另外一个h文件中定义`MY_EXPORT_MACRO`宏,然后在所有的头文件中包含它
网友评论