- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们在带有 c# 和 c++ 代码的中型嵌入式系统中使用 Protocol Buffer (2.4.1)。我们使用 protobufs 来隔离我们的托管层和 native 层,以及一个易于维护的序列化层(出于好奇,我们本来可以使用 Pinvoke,但我们还必须在测试/模拟器上的单独进程中运行 native 代码)。
我们的系统有很多 DLL,我在它自己的 DLL 中有生成的 native protobuf 代码,这样系统的其他部分就不必直接链接到生成的代码中。
我遇到的问题是所有生成的访问器都是内联,例如:
inline const ::MyProtoClassName::MyField& MyProtoClassName::myfield() const
{
return myfield_ != NULL ? *myfield_ : *default_instance_->myfield_;
}
按大小使用生成的 API(如果未设置此特定字段,将取消引用和访问“default_instance_”)。这意味着我无法链接 (lnk2001) 任何使用访问器的客户端,因为没有符号 default_instance_
我认为 ProtoBufs 的典型用例是在生成的 protobuf 代码本身中有每个组件链接(毕竟,这主要是分布式系统的序列化层),但是
我想知道是否有一个编译开关可以改变我错过的内联行为。 (在 CC 文件中定义所有访问器,而不是 H)
谢谢!
谢谢 @g-makulik !看起来答案在 ProtoC 代码中大约有 30 行,我只是没看到它:)
正如 Kenton 的一些变更日志中所指出的,添加它会导致一些与基类相关的警告(C4251、c4275),这些基类也不是 DLLEXPORT
根据 ProtoBufs 的实现方式,并且 protobuf 类都是模板,这些警告是良性的。为了完全忽略它们(例如,不必为所有客户端禁用警告),我使用了这种有点老套的方法:
-每个人都包含的 protobuf.h 文件的包装器。 (没有包含真正生成的H文件)
#pragma once
#pragma warning(push)
#pragma warning(disable:4251)
#pragma warning(disable:4275)
// include the protobuf generated code; but exclude the warn c4251, c4275
// these relate to the dll exported
#include "yourProtoFile.h"
#pragma warning(pop)
和一个包装器 C 文件(真正的 protobuf CC 文件不在我的项目中 -> 不是直接构建的)
#include "MyProtoFile_WRAPPER.h"
#include "MyProtoFile.cc"
最佳答案
我认为此链接可以回答您的问题:Protobuf with MSVC: how to export generated Message
引用自 Kenon Varga(google protobuf 项目负责人):
If you invoke protoc like:
protoc --cpp_out=dllexport_decl=MY_EXPORT_MACRO:path/to/output/dir myproto.proto
then it will generate code with MY_EXPORT_MACRO in all the right places. However, this option is incomplete -- currently there is no way to force the generated .pb.h to #include a header which defines MY_EXPORT_MACRO. I'm open to patches to fix this. Or, you could use a hack to work around it, such as adding the #include via some sort of text processing after protoc finishes, or perhaps moving the .pb.h to .pb2.h and replacing the .pb.h file with one that first includes your header then includes the .pb2.h...
此外,为了弥补提到的不完整性(引自 Aron Bierbaum):
We currently get around this limitation by forcing the the header to be included using compiler command line flags:
Windows: /FIproject/Config.h
Linux: -include project/Config.h
注意:
在这种情况下,使用 inline
关键字不应该是相关的(附加的 __declspec dllexport
/__declspec dllimport
属性放在访问器方法上) .根据定义,是否内联函数取决于编译器。当然,看到 __declspec dllexport
或 __declspec dllimport
属性与内联是矛盾的。
关于c++ - Protocol Buffer - 生成非内联访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17980467/
我可以看到有状态的协议(protocol)可以减少像 cookie 这样的“模拟状态”。 但是测试变得更加难以确保您的实现正确并重新连接,并且 session 继续可能很难处理。 始终使用无状态协议(
我正在尝试为我的下一个分布式应用程序找到合适的协议(protocol)中间件。在过去的几天里,我找到了几个规范,想知道我是否错过了一个重要的规范?它应该是二进制协议(protocol),支持 RPC,
我正在做一个研究生院软件工程项目,我正在寻找管理 ATM 和银行网络之间通信的协议(protocol)。 我已经在谷歌上搜索了很长一段时间,虽然我找到了各种有关 ATM 的有趣信息,但我惊讶地发现似乎
我正在开发一个 ECG 模块,它以字节为单位给出数据。有一个关于它的协议(protocol)文档解释了如何构建从模块中出来的数据包。我想解码该数据。我很困惑 Protocol Buffer 是否会对此
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 3年前关闭。 Improve this qu
我需要在我的程序中包含基本的文件发送和文件接收例程,并且需要通过 ZMODEM 协议(protocol)。问题是我无法理解规范。 供引用,here is the specification . 规范没
我最近听到这个术语来描述 Google 的新环聊协议(protocol)和 Whisper System 的新 encrypted texting app . The new TextSecure p
如何检查某个对象是否符合协议(protocol)? 我试过这种方式,但出现错误: if lCell.conformsToProtocol(ContentProtocol) { } 最佳
在应用程序中,我们有两种类型的贴纸,字符串和位图。每个贴纸包都可以包含两种类型。这就是我声明模型的方式: // Mark: - Models protocol Sticker: Codable { }
这个问题在这里已经有了答案: Why can't a get-only property requirement in a protocol be satisfied by a property w
我有以下快速代码: protocol Animal { var name: String { get } } struct Bird: Animal { var name: String
我在遵循继承树的几个类中分配协议(protocol)。像这样: 头等舱 @protocol LevelOne - (void) functionA @end @interface BaseClass
我们之前使用的是 fix,但客户说使用 OUCH 进行交易,因为这样速度更快。我在互联网上查了一下,消息看起来很相似。它如何获得速度优势。请给我一些示例消息 最佳答案 基本上,FIX 消息以文本格式传
在我的 swift 项目中,我有一个使用协议(protocol)继承的案例,如下所示 protocol A : class{ } protocol B : A{ } 接下来我要实现的目标是声明另一个具
我想根据这两种协议(protocol)的一般特征(例如开销(数据包)、安全性、信息建模和可靠性)来比较 OPC UA 和 MQTT。我在哪里可以找到每个协议(protocol)的开销和其他特性的一些示
本质上,我的最终目标是拥有一个协议(protocol) Log,它强制所有符合它的对象都有一个符合另一个协议(protocol) [LogEvent] 的对象数组. 但是,符合Log的类需要有特定类型
我正在尝试为基于左操作数和右操作数标识的协议(protocol)实现 Equatable 协议(protocol)。换句话说:我如何为一个协议(protocol)实现 Equatable 协议(pro
问题不在于编程。 我正在使用一台旧机器,微软停止了这些机器的补丁。 有没有人针对攻击者已知的使用端口 445 的 SMB 协议(protocol)漏洞的解决方案? 任何棘手的解决方案? 换句话说,我想
在我们的业务中,我们需要记录到达我们服务器的每个请求/响应。 目前,我们使用 xml 作为标准实现。 如果我们需要调试/跟踪某些错误,则使用日志文件。 如果我们切换到 Protocol Buffer
你推荐什么协议(protocol)定义? 我评估了 Google 的 Protocol Buffer ,但它不允许我控制正在构建的数据包中字段的位置。我认为 Thrift 也是如此。我的要求是: 指定
我是一名优秀的程序员,十分优秀!