生成一个使用协议缓冲区的 DLL

Posted

技术标签:

【中文标题】生成一个使用协议缓冲区的 DLL【英文标题】:Generate a DLL which uses protocol-buffers 【发布时间】:2020-10-20 16:03:13 【问题描述】:

我正在开发一个使用我创建的 protobuf 类型的 C++ (VS2017) 项目。

但是,该项目需要上述 protobuf 类型的 .dll。每个类声明中的__declspec( dllexport )默认不存在,我在网上看到可以通过使用这个命令行生成protobuf对象来添加它们:

--cpp_out=dllexport_decl=MY_EXPORT_MACRO:output/directory

没有人解释过MY_EXPORT_MACRO 是什么或如何定义它。当我第一次生成我的 protobuf 对象时,我使用了最基本的一行并且它起作用了:

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/my_file.proto

MY_EXPORT_MACRO 是什么以及在哪里和/或是否有其他方法可以使我的 protobuf 文件 .dll 兼容?

【问题讨论】:

【参考方案1】:

你也知道__declspec( dllimport ),对吗?在构建 DLL(带有 dllexport 注释)和 DLL 客户端(带有 dllimport 注释)时使用相同类型定义的最简单方法是什么?

使用宏来切换注解是各种 Win32 DLL 开发中极为常见的做法,而不仅仅是 protobuf DLL。

通常定义是这样运行的:

#if BUILD_DLLX
#  define DLLX_API __declspec(dllexport)
#else
#  pragma comment('lib', 'dllx.lib')
#  define DLLX_API __declspec(dllimport)
#endif

然后您将使用--cpp_out=dllexport_decl=DLLX_API:$DST_DIR,以便生成的头文件在正确的位置插入DLLX_API。然后使用/DBUILD_DLLX 构建DLL,以便导出类型和函数。

DLL 的使用者可以#include 完全相同的头文件,并且在他们的项目配置中没有/DBUILD_DLLX,他们最终会得到导入。

【讨论】:

感谢您提供的信息丰富的回答!这段代码到哪里去了? @JessicaChambers:在 DLL 的头文件中,该文件包含 DLL 导出的函数的所有类型和原型。在 DLL 自己的代码和使用 DLL 的代码中都应该是 #included。 感谢您的回答,有人知道是否有办法让 protoc 直接在生成的标题中添加定义 DLLX_API#include ?我环顾四周,但一无所获。

以上是关于生成一个使用协议缓冲区的 DLL的主要内容,如果未能解决你的问题,请参考以下文章

针对 iOS 的 Unity3D 中的协议缓冲区

编译协议缓冲区生成的源文件时是不是有更好的方法来解决警告?

如何将已编译的协议缓冲区转换回 .proto 文件?

谷歌协议缓冲区是不是支持序列化前的大小计算?

协议缓冲区(Protocol Buffers)

使用 Google 协议生成 C# 文件失败