- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们使用 google protobufs 在线传递数据。服务器端类似于插件,因此处理 protobuf 消息的几个模块是 DLL。一些 DLL 依赖于其他 DLL,并使用其他 DLL 的消息来定义自己的消息。
因此,A.DLL 具有a.proto
,它生成带有消息类MsgA
的a.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
有多个定义 是一个主要问题。
所以,最后,这是问题:
MsgA
的多个定义分散在整个 DLL 中真的安全吗?一旦我着手重建 protobuf 库,我可能会在几天内回答第一点,但第二点超出了我目前的知识范围。我也希望得到一个快速的向上或向下的答案,这样可以省去重新编译原型(prototype)库的麻烦。
最佳答案
我已经在网络上使用了用于 RPC 的原型(prototype)缓冲区(Google 也这样做了 - 请参阅文档页面)。只要您对使用原型(prototype)缓冲区的每个人都有一个相似的定义,一个定义就会愉快地反序列化由其他定义序列化的数据。事实上,只要你不重新分配标签号,旧版本的 Protocol Buffer 定义就可以与新版本交互(只要反序列化定义中的“必需”字段存在于流中,它将成功)。
希望对您有所帮助。
关于c++ - 您能否将相同的 protobuf 消息静态链接到多个 DLL - 然后让这些 DLL 协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2330127/
我想插入 备注 关于要在我的 latex 文档的特定位置进行的修复 也许有一个 列表的“待办事项/修复我” 你怎么处理这个? 似乎一种方法是使用 fixme 包,但我无法使其工作。 有人在用吗? 最佳
错误:无法创建表。我已经创建了一个数据库,并且已经提供了所有特权。但仍然无法登录协作模块。我受够了,但我不想放弃。我已经尝试了所有可能的方法,但都行不通。 Stackoverflow 是我所知道的最好
我是一名优秀的程序员,十分优秀!