gpt4 book ai didi

c++ - Protocol Buffer - 生成非内联访问器

转载 作者:可可西里 更新时间:2023-11-01 13:26:16 29 4
gpt4 key购买 nike

我们在带有 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/

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