在windows平台上,首先要编译的是protocol buffer的动态链接库版本,为什么要用dll版本的,下面再说原因。
protobuf_BUILD_SHARED_LIBS这里要勾选,其余步骤这里就不多说了,具体编译过程可以参考我的上一篇博客。
以下皆宜x64位debug版本在Qt Creator中的使用为例。
先贴出.pro配置文件中的关键部分
DEFINES += PROTOBUF_USE_DLLS
INCLUDEPATH += .\include_protobuf \
.\include_protobuf\google\protobuf\io \
.\include_protobuf\google\protobuf\util \
.\include_protobuf\google\protobuf\util\internal \
LIBS += $$PWD/lib/libprotobufd.lib
记录一下自己遇到的问题:
(1)动态库版本和静态库版本使用一样,都只添加libprotobufd.lib,但动态库版本在Qt中编译会爆出这样的错误:
贴出具体的错误就是这样:
main.obj:-1: error: LNK2001: 无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > google::protobuf::internal::fixed_address_empty_string" (?fixed_address_empty_string@internal@protobuf@google@@3V?$ExplicitlyConstructed@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@123@A)
解决方法:
在.pro文件里添加
DEFINES += PROTOBUF_USE_DLLS
参考:https://www.cnblogs.com/linxmouse/p/8975475.html
(2)静态库版本的protoc.exe和动态库版本protoc.exe对.proto处理后生成的文件是相同的。这个是自己做实验得到的结果。
(3)windows + Qt 中使用protobuf静态库版本遇到的问题:
在.pro中添加了MTd方式,继续出现这样的问题,原因是和免费的Qt使用的是动态库版本有关(个人猜想)。
(4)进行了一种尝试,在VS2015中安装Qt插件,编译Qt的工程,然后导出pro配置文件,对比。尝试过程中,发现vs2015安装Qt插件后,新建Qt工程,是可以在VS中设置Mtd方式的,而且也可以编译通过,这样可以使用protobuf的静态库版本,但是导出的pro没有到达预期。
vs2015中添加Qt插件,创建Qt工程参考:
https://blog.csdn.net/bloke_come/article/details/76572101
猜想:可能需要手动编译Qt,编译成静态库版本,就可以使用protobuf的静态库版本,由于时间的限制,这就没有继续这样尝试了。
先记录这么多,今天尝试了大半天,总算可以在Qt Creator中使用protobuf动态库版本的了,还有C4100和C4251的warning需要屏蔽。
QT 忽略警告,参考:https://blog.csdn.net/Jones_Workspace/article/details/73732332
在pro的最上面,添加如下:
win32-msvc* {
QMAKE_CXXFLAGS *= /wd"4100"
contains (QMAKE_CXXFLAGS_WARN_ON, -w34100) : QMAKE_CXXFLAGS_WARN_ON -= -w34100
QMAKE_CXXFLAGS *= /wd"4251"
contains (QMAKE_CXXFLAGS_WARN_ON, -w34100) : QMAKE_CXXFLAGS_WARN_ON -= -w34189
}
在代码中测试是否可用,可以参考我 上一篇博客:
https://blog.csdn.net/hp_cpp/article/details/81561310
参考:
Qt在pro中设置运行时库MT、MTd、MD、MDd中的区别:
https://blog.csdn.net/caoshangpa/article/details/51416077