在DLL中使用Protobuf的注意事项

在创建的DLL工程中引入Protobuf,需要注意以下几点。

1、使用DLL导出宏

如同DLL头文件常用的宏定义:

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

在使用protoc.exe将proto生成的C++文件也要添加DLLX_API。通过修改protoc参数--cpp_out=dllexport_decl=DLLX_API:$DST_DIR的方式,将DLLX_API替换为你的自定义宏。

在生成的.h文件中,还需要额外手动添加上面的宏定义:

#if BUILD_DLLX
#  define DLLX_API __declspec(dllexport)
#else
#  define DLLX_API __declspec(dllimport)
#endif

2、使用DLL时不能包含DLL中已使用的XXX.pb.cc文件

在DLL工程中,编译是需要.pb.cc文件的。然而在使用该DLL的工程中,虽然可以引用XXX.pb.h文件,但不能引用XXX.pb.cc文件,否则可能会导致C2491错误。

 error C2491: “::_class_data_”: 不允许 dllimport 静态数据成员 的定义

参考:

留下评论

您的电子邮箱地址不会被公开。