protobuf使用出现的问题以及方法

在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`宏,然后在所有的头文件中包含它

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问题: 背景: 工作中开发的CookieTool工具是一个MFC的程序,如果选择以共享dll中使用MFC的方式,那...
    unsummon阅读 3,663评论 1 5
  • 问题: 做ios项目中用到1个第三库:shareSDK,需要因为新浪分享可能是是C++写的需要在buildsett...
    LYDeveloper阅读 2,503评论 2 1
  • 【转载】原文地址:std::string详解作者:kieven2008 之所以抛弃char*的字符串而选用C++标...
    VAYY阅读 661评论 0 2
  • 清晨6点30,男孩迷茫着睁开眼,早晨的空气很清新,男孩的脑中却似乱麻。不等头脑清醒,男孩翻身就拿手机──他在等消息...
    Sakuraok阅读 227评论 0 1
  • 后来我问吴斌,是不是故意让王二来搅和的。他说,那天发生的事他完全不记得了。反正,不管他说什么,我是不能完全的相信。...
    敬亭山写手圈阅读 433评论 0 0