【问题标题】:Generate a DLL which uses protocol-buffers生成一个使用协议缓冲区的 DLL
【发布时间】:2021-02-06 17:56:21
【问题描述】:

我正在开发一个使用我创建的 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 兼容?

【问题讨论】:

    标签: c++ dll protocol-buffers


    【解决方案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 ?我环顾四周,但一无所获。
    猜你喜欢
    • 2021-01-04
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2013-09-21
    • 2022-08-19
    相关资源
    最近更新 更多