在创建的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 静态数据成员 的定义