Windows + Qt Creator + Protobuf的编译和使用历程

6 篇文章 1 订阅

在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

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值