生成一个使用协议缓冲区的 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 的代码中都应该是#include
d。
感谢您的回答,有人知道是否有办法让 protoc 直接在生成的标题中添加定义 DLLX_API
的 #include
?我环顾四周,但一无所获。以上是关于生成一个使用协议缓冲区的 DLL的主要内容,如果未能解决你的问题,请参考以下文章