Protocol Buffers使用注意事项

Protocol Buffers做为广泛使用的一个序列化开源库,提供了很多语言下的支持,本文就谈谈MSVC c++使用pb遇到的问题,当然这些问题因为每个人的使用模式不同,可能都不一样,本文也不讨论怎么写proto及编译。

我们使用pb做序列化可以把pb生成静态库或者动态库(libprotobuf.dll),然后使用protoc将message生成相应的cc文件,这些cc文件结构都类似,基本不需要关心她做了什么。若只是将这些CC在A,B两个网络程序中传输数据都很正常。如果程序结构是A(可执行文件)+B(动态库),CC文件在A,B之中都有使用,A调用B提供的接口,数据交互使用CC中的类,将一个CPP文件使用在不同的工程中是常态,但是这样在MSVC不行。以下分静态库和动态库链接分别说明:

使用pb动态库连接A、B:由于每个CC文件会执行PROTOBUF_NAMESPACE_ID::internal::AddDescriptors,导致“File already exists in database”。(加宏定义PROTOBUF_USE_DLLS)。

使用pb静态库链接A、B:由于SetNoArena->IsDefault返回false,所以string在A、B之间无法传输,此处是因为在A,B之中GetEmptyStringAlreadyInited不一致。

解决办法:将所有message生成的cc封装到一个dll中,导出class。将所有CC封装为静态库未试,毕竟静态只是中间文件的打包。

 

运行环境:win10+VS2017

文中若有错误,欢迎斧正!

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值