我们在中等大小的嵌入式系统中使用协议缓冲区(2.4.1),带有c#和C++代码。我们使用protobufs来隔离我们的托管层和本地层,并提供易于维护的序列化层(为了好奇,我们只是使用了Pinvoke,但我们还必须在测试/模拟器的单独进程中运行本机代码)。协议缓冲区 - 生成非内联访问器
我们的系统有一些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行了,我只是没有看到它:)
- <请参阅下面的整体溶液的他的回答>这也应该帮助你,虽然。
正如一些肯顿的更新日志中指出,加入这会导致与基础类,是不是也DLLEXPORT'd
与方式ProtoBufs实现多次警告(C4251,c4275),和protobuf类是所有模板,这些警告是良性的。要干净地忽略它们(例如,不必禁用所有客户端的警告)我使用这个有点hacky的方法:
- eveyone包含的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"
我在ProtoC代码中看到内联函数代码gen似乎只能从GenerateHeader(...)调用中调用......但我希望互联网已经解决了我面前的这个问题! :) – mike