Dav*_*ver 7 c++ dll linker protocol-buffers
我们正在使用谷歌protobufs在线上传递数据.事物的服务器端是插件式的,因此处理protobuf消息的几个模块是DLL.某些DLL依赖于其他DLL并使用其他DLL来定义自己的消息.
因此,A.DLL 使用消息类a.proto生成.使用protoc编译器上的未记录选项,将消息类声明为DLL导出.a.pb.h/ccMsgAdllexport_decl
现在,B.DLL依赖于A.DLL,b.proto也看起来像这样:
import "a.proto";
message b
{
required int32 some_number = 1;
required PackageA.MsgA some_a = 2;
}
Run Code Online (Sandbox Code Playgroud)
最后,将部件拉到一起的可执行文件也取决于消息MsgA.protobuf库也构建为DLL,并链接到所有内容.它都构建和运行.
但是,还有Forces of Light要求我们减少DLL分发!因此,我构建了模块A(它只是许多其他插件DLL使用的消息和小工具集合)作为静态库而不是DLL.B.DLL和可执行文件都链接到A,一切都很好 - 到目前为止.
由于A是静态链接的,因此MsgA在所有DLL和EXE中都得到了完全定义.这没关系,因为生成的C++代码中的所有静态数据都是const.那么,如果最终过程中有多个副本,那么所有副本都是相同的.
但是,当我运行新构建的进程时,libproto会抛出一个实际有用的异常--MsgA的文件ID已经存在于描述符映射中(或类似的东西).换句话说,存在多个定义的事实MsgA 是一个主要问题.
所以,最后,问题是:
MsgA在整个DLL 中分散多个定义是否真的安全?第一点我可能会在几天内回复自己,以便重建protobuf库,但第二点远远超出我目前的知识.我也希望得到一个快速上升或下降的答案,可以省去重新编译proto libs的麻烦.
小智 1
我已经使用 protobuffers 通过网络进行 RPC(Google 也这样做 - 请参阅文档页面)。只要您对使用 proto 缓冲区的每个人都有类似的定义,一个定义就会愉快地反序列化由其他定义序列化的数据。事实上,只要您不重新分配标签号,旧版本的协议缓冲区定义就可以与新版本进行良好的交互(只要反序列化定义中的“必需”字段存在于流中,它将成功)。
希望有帮助。
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |