Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 能否将同一protobuf消息静态链接到多个DLL中,然后让这些DLL一起工作?_C++_Dll_Linker_Protocol Buffers - Fatal编程技术网

C++ 能否将同一protobuf消息静态链接到多个DLL中,然后让这些DLL一起工作?

C++ 能否将同一protobuf消息静态链接到多个DLL中,然后让这些DLL一起工作?,c++,dll,linker,protocol-buffers,C++,Dll,Linker,Protocol Buffers,我们正在使用google protobufs在网络上传递数据。服务器端类似于插件,因此处理protobuf消息的几个模块是DLL。一些DLL依赖于其他DLL,并使用其他DLL的消息定义自己的消息 因此,A.DLL具有A.proto,它使用消息类MsgA生成A.pb.h/cc。使用protoc编译器上未记录的dllexport_decl选项,消息类被声明为DLL导出 现在,B.DLL依赖于A.DLL,并且B.proto看起来也是这样的: import "a.proto"; message b {

我们正在使用google protobufs在网络上传递数据。服务器端类似于插件,因此处理protobuf消息的几个模块是DLL。一些DLL依赖于其他DLL,并使用其他DLL的消息定义自己的消息

因此,A.DLL具有
A.proto
,它使用消息类
MsgA
生成
A.pb.h/cc
。使用protoc编译器上未记录的
dllexport_decl
选项,消息类被声明为DLL导出

现在,B.DLL依赖于A.DLL,并且
B.proto
看起来也是这样的:

import "a.proto";
message b 
{
    required int32 some_number = 1;
    required PackageA.MsgA some_a = 2;
}
最后,将这些部分拉到一起的可执行文件也取决于消息
MsgA
。protobuf库也是作为DLL构建的,并且链接到所有内容中。所有这些都是构建和运行的

但是,光的力量要求我们减少DLL的分发!因此,我将模块A(它只是许多其他插件DLL使用的消息和小UTIL的集合)构建为一个静态库,而不是DLL。DLL和可执行文件都链接到A,到目前为止一切都很好

由于A是静态链接的,
MsgA
在所有DLL和EXE中得到完全定义。这是可以的,因为生成的C++代码中的所有静态数据都是const。那么,如果在最后的过程中有多个副本呢?所有副本都是相同的

但是,当我运行新构建的进程时,libproto抛出了一个实际有用的异常-MsgA的文件ID已经存在于描述符映射中(或者类似的东西)。换句话说,
MsgA
有多种定义这一事实是一个主要问题

最后,问题是:

  • 如果我们静态链接libproto而不是将其用作DLL,错误会消失吗
  • MsgA
    的多个定义分散在DLL中真的安全吗

一旦我着手重建protobuf库,我可能会在几天内回答自己的第一点,但第二点超出了我目前的知识范围。我还希望得到一个快速的上下回答,这样可以省去我重新编译proto-libs的麻烦。

我已经在网络上为RPC使用了protobuffers(谷歌也这样做了-请参阅文档页)。只要您对使用proto缓冲区的每个人都有一个类似的定义,一个定义就会很高兴地反序列化由其他定义序列化的数据。事实上,只要不重新分配标记号,协议缓冲区定义的旧版本就可以与新版本很好地交互(只要反序列化定义中的“必需”字段存在于流中,它就会成功)


希望这有帮助。

我不能回答这个问题,但您提到的“dllexport_decl”帮助了我!谢谢大家!!我遇到了完全相同的问题,没有找到一个好的解决方案。如果有人能提供,我很感兴趣。这个线程似乎是关于相同的问题。