Qt pro工程文件编写汇总(区分debug和release、32位和64位的方法,编译输出目录等)

前言:

从事qt开发已经好几年了,但有关pro编写的一些细节问题一直没有一个很好的梳理汇总------因为实际工作开发中,往往只需要编译特定版本的软件(例如32位release版本),项目创建好后并设置好编译路径,并且库链接不出错,程序能跑起来后,后续只需要进行代码开发和升级就好了。

然而,随着开发需求越来越多,首先单个项目用到的库非常多,并且各种版本,兼容32/64位的库,往往会把pro文件搞得很乱,而一旦需要从32位更换64位,又想换成debug模式的话,往往编译出几百个错误,大多都是库链接不上的问题,这个时候问题排查可能就很耗费时间,也很让人崩溃( LNK2001: 无法解析的外部符号这种编译报错,没有给出真正的原因,总是让人很暴躁崩溃)

总而言之,进行qt开发的时候,pro文件兼容debug/release,支持32位/64位,这样会比较方便,而且也是一个好习惯。某些软件在最终打包安装的时候,也可以提供给用户自由选择安装的版本。

理论上,pro文件中也可以区分安卓、linux甚至ios的方法,不需要重复注释代码段的。以下只是Windows的区分,以后如果有其他开发,再补充吧。

pro代码:

cpp 复制代码
win32{
contains(QT_ARCH, x86_64){
    #64位
#    message("64-bit")
    #Module1
    win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build_64/xxx/xxx/release/ -lxxx
    else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build_64/xxx/xxx/debug/ -lxxx
    
    #Module2
    LIBS += -L$$PWD/../xxx/xxx/x64/ -lxxx
    INCLUDEPATH += $$PWD/../xxx/xxx/

}else{
    #32位
#    message("32-bit")
    #Module1
    win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build/xxx/xxx/release/ -lxxx
    else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build/xxx/xxx/debug/ -lxxx

    #Module2
    LIBS += -L$$PWD/../xxx/xxx/x86/ -lxxx
    INCLUDEPATH += $$PWD/../xxx/xxx/
}
}

1.win32{ },就是Windows平台嘛,如果是linux就是unix{ },只要将代码包起来,在对应平台编译就不会跑其他的代码

2.contains(QT_ARCH, x86_64){

}else{ }

这是32/64位的区别,x86_64是64位,else就是32位了

3.win32:CONFIG(release, debug|release): ...

else:win32:CONFIG(debug, debug|release):...

这个就是debug和release的区分,可以将对应lib的链接写在这里,一般来说路径都不会不一样

4.生成路径

cpp 复制代码
win32:CONFIG(release, debug|release): DESTDIR = ../bin_moduleProjectMain/Release
else:win32:CONFIG(debug, debug|release): DESTDIR = ../bin_moduleProjectMain/Debug

这样设置,能在debug和release的不同模式下,将执行文件exe分别输出到不同的目录下,不会混淆。值得一提的是,如果没有设置DESTDIR ,默认执行文件时被放到build目录下的,虽然也有debug/release的区分,但会有一大堆moc,obj这些多余的生成文件,对程序运行没有用处,所以要将bin和build目录区分开来。

至于编译路径build,直接在qt-项目-构建目录,设置就好了,上述DESTDIR 的".../xxx"也是基于这个目录进行返回上一级的

个人比较推荐,在我们的工程目录底下,分为三个文件夹,分别是工程代码、build编译中间文件、bin输出文件,除此之外还可以加readme说明,还有参考文档,第三方库等文件夹

5.执行文件打包

如果按照我以上的步骤编译,最终bin中一般只有三个文件,其中exe是最主要的,也是最终的执行文件。那么,如果在qt中直接运行,当然可以把程序跑起来,可在bin目录中直接点击exe,就会缺少库了。

首先,我们需要补充qt的库,那么qt有一个良好的打包功能,一般来说,点击开始菜单-Qt 5.14.2-Qt 5.14.2 (MSVC 2017 32-bit),我们需要用这个工具进行打包。(如果是64位的话要选择对应的那个,不然最终exe是跑不起来的!!!)

然后,cd移动到exe所在的文件夹,然后输入windeployqt xxx.exe,工具就会帮你自动补全qt相关的所有库了。(注意,有极个别的库可能会缺漏,比如opengl啊那些,也不知道是不是我个人的问题。如果缺少,大家可以在qt安装目录下把dll找出来,复制进去即可)

除此之外,当然是需要将我们的第三方库复制进去了,这个具体情况按照自己的来。

不过即便如此,你的程序也有可能在其他电脑中跑不起来哦,可能缺少一些vc库什么的。这里我建议安装包内内嵌一个vc库打包合集什么的,用户安装的时候可以补全一下。又或者你自己复制补全进自己的文件夹里面,但是保不准出现在其他电脑上跑不起来的情况。

另外还可以加入内嵌的软件啊,巴拉巴拉什么的,这里就不说了。

相关推荐
jokerest12313 分钟前
pwn——test_your_nc1——测试
开发语言·php
碧海蓝天202225 分钟前
接上一主题,C++14中如何设计类似于std::any,使集合在C++中与Python一样支持任意数据?
开发语言·c++·python
醉颜凉29 分钟前
计算(a+b)/c的值
java·c语言·数据结构·c++·算法
周杰伦fans31 分钟前
Java与C#
java·开发语言·c#
zl.rs34 分钟前
对比C++,Rust在内存安全上做的努力
c++·安全·rust
SAP学习成长之路1 小时前
SAP 零售方案 CAR 系统的介绍与研究
大数据·开发语言·sap·abap·零售·car·bapi
机器视觉知识推荐、就业指导1 小时前
Qt/C++基于重力模拟的像素点水平堆叠效果
c++·qt
A_Tai23333331 小时前
MyBatis高级扩展
java·开发语言·mybatis
夏子曦1 小时前
java虚拟机——频繁发生Full GC的原因有哪些?如何避免发生Full GC
java·开发语言
Thomas_YXQ1 小时前
Unity3D Lua如何支持面向对象详解
开发语言·游戏·junit·性能优化·lua·unity3d