gpt4 book ai didi

c++ - 您能否将相同的 protobuf 消息静态链接到多个 DLL - 然后让这些 DLL 协同工作?

转载 作者:可可西里 更新时间:2023-11-01 18:39:49 29 4
gpt4 key购买 nike

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

因此,A.DLL 具有a.proto,它生成带有消息类MsgAa.pb.h/cc。在协议(protocol)编译器上使用未记录的 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 使用的消息和小实用程序的集合)构建为静态库而不是 DLL。 B.DLL 和可执行文件都链接到 A,一切都很好 - 到目前为止。

由于 A 是静态链接的,MsgA 在所有 DLL 和 EXE 中得到完整定义。这没关系,因为生成的 C++ 代码中的所有静态数据都是常量。那么如果在最终过程中有多个拷贝怎么办 - 所有拷贝都是相同的。

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

所以,最后,这是问题:

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

一旦我着手重建 protobuf 库,我可能会在几天内回答第一点,但第二点超出了我目前的知识范围。我也希望得到一个快速的向上或向下的答案,这样可以省去重新编译原型(prototype)库的麻烦。

最佳答案

我已经在网络上使用了用于 RPC 的原型(prototype)缓冲区(Google 也这样做了 - 请参阅文档页面)。只要您对使用原型(prototype)缓冲区的每个人都有一个相似的定义,一个定义就会愉快地反序列化由其他定义序列化的数据。事实上,只要你不重新分配标签号,旧版本的 Protocol Buffer 定义就可以与新版本交互(只要反序列化定义中的“必需”字段存在于流中,它将成功)。

希望对您有所帮助。

关于c++ - 您能否将相同的 protobuf 消息静态链接到多个 DLL - 然后让这些 DLL 协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2330127/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com