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代码:

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.生成路径

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库打包合集什么的,用户安装的时候可以补全一下。又或者你自己复制补全进自己的文件夹里面,但是保不准出现在其他电脑上跑不起来的情况。
另外还可以加入内嵌的软件啊,巴拉巴拉什么的,这里就不说了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/649764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美团Java社招面试题真题,最新面试题

如何处理Java中的内存泄露? 1、识别泄露: 使用内存分析工具(如Eclipse Memory Analyzer Tool、VisualVM)来识别内存泄露的源头。 2、代码审查: 定期进行代码审查,关注静态集合类属性和监听器注册等常见内…

逻辑分析仪的调试使用

调试软件下载:点击跳转 一、接线 逻辑分析仪 设备 GND --- GND CHX(数据通道) --- 通信引脚 二、数据采集 图中两个可以选择数字大小的地方分别表示 采样深度 (10M Samples&a…

Swift 类和结构体

类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常…

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多,一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求,我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…

xml篇---提取VOC格式的坐标,并按照cameraID进行排序(二)

xml篇—提取VOC格式的坐标,并按照cameraID进行排序(二) import os import xml.etree.ElementTree as ETdef parse_xml(xml_file):tree ET.parse(xml_file)root tree.getroot()objects {}for obj in root.findall(object):name obj.find(…

使用ResNet-50训练自己的数据集(花的种类)

1.数据集处理 具体操作 1.把不同类别的花(或者自己数据集的不同类别)放在不同的文件夹下 2.文件夹名字是花朵类别 代码预处理 # 对数据集进行处理 import os from shutil import copy import randomdef mkfile(file):if not os.path.exists(file):os…

简易计算器

前言 简易计算器,旨在实现一个简单的计算器功能。 整形,浮点型数据的加减乘除运算;数据的统计(如文件中某字符的出现频数);期望,方程运算;平均数,最小值,最大值,中位数…

每日5题Day11 - LeetCode 51 - 55

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>…

揭秘订单排队模式:社交电商新策略

随着移动互联网的蓬勃发展&#xff0c;社交电商正以其独特的魅力席卷全球。据权威机构预测&#xff0c;到2024年&#xff0c;全球社交电商市场规模有望达到惊人的2.8万亿美元。面对如此庞大的市场蛋糕&#xff0c;如何精准把握机遇&#xff0c;实现业务的跨越式增长&#xff0c…

SQL157 平均播放进度大于60%的视频类别

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-10-01 10:00:002021-10-01 10:00:30011NULL210220012021-10-01 10:00:002021-10-01 10:00:21001NULL310320012021-10-01 11:00:502021-10-01 11:01…

强大的医院绩效考核管理系统源码,支持行业内所有绩效方案,且每步核算都可自主进行方案的新建、调整。

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件源码。 系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统…

定时调度任务——kettle开发22

一、流查询 流查询在查询前把数据加载到内存中&#xff0c;并且只能进行等值查询。 流查询的操作包括指定数据源&#xff0c;即我们将数据进行流查询的数据源头&#xff0c;如下图所示流查询的数据源是我们的Excel输入-departments&#xff0c;然后我们还需要指定我们进行流查…

手机远程协助,3个方法,开启沟通新篇章

已经不仅仅是一个通讯工具&#xff0c;更是一个多功能的魔法棒。它轻轻一挥&#xff0c;就能让我们跨越千山万水&#xff0c;与亲朋好友、合作伙伴进行亲密无间的交流。今天&#xff0c;就让我们一起探讨如何利用手机远程协助的三大法宝&#xff0c;开启沟通的新篇章&#xff0…

二叉树——堆的实现

一.前言 前面我们讲解了二叉树的概念以及二叉树的存储结构&#xff1a;https://blog.csdn.net/yiqingaa/article/details/139224974?spm1001.2014.3001.5502 今天我们主要讲讲二叉树的存储结构&#xff0c;以及堆的实现。 二.正文 1.二叉树的顺序结构及实现 1.1二叉树的顺序…

手动操作很麻烦?试试这个自动加好友神器吧!

你是不是也觉得手动逐一输入号码或是微信号&#xff0c;再搜索添加很麻烦&#xff1f;试试这个自动加好友神器——个微管理系统&#xff0c;帮助你省去繁琐的手工操作&#xff0c;节省时间和精力。 首先&#xff0c;在系统上登录微信号&#xff0c;无论你有多少个微信号&#…

服务器重装系统与磁盘操作

诱因&#xff1a;服务器原来装的EXSI&#xff0c;现在要重装一个ubuntu server&#xff0c;出现了下面一些问题&#xff0c;在此记录一下。 目录 1、过程中出现的问题&#xff08;2024.5.26&#xff09;1.1 问题1&#xff1a;如何磨掉原来的ESXI&#xff1f;1.2 问题2&#xf…

【Typescript】通过变量的值即可获取变量的类型【typeof 变量】

注意&#xff1a;只要变量的类型准确,则typeof获取变量的类型就不会错 enum Test {a "a0",b "b0" }// 这里的a是一个变量的值 let a: Test.a "a0" as Test.a// 这里的typeof a是一个类型【Test.a】 let x: typeof a Test.a

玩转香橙派 AIpro,高性能AI开发板评测与项目案例分享

公司最近刚忙完一个项目&#xff0c;闲暇之余&#xff0c;看着手里的树莓派、stm32、Esp32又有些手痒了&#xff0c;准备再搞点小项目出来&#xff0c;但一直没有什么好想法。 说来也巧&#xff0c;恰好收到了CSDN官方的OrangePi AIpro测评活动&#xff0c;平时一直都在用树莓…

matplotlib---气泡图

气泡图简介&#xff1a; 气泡图&#xff08;Bubble Chart&#xff09;是一种数据可视化图形&#xff0c;主要用于展示多个数据点之间的关系。 气泡图通过气泡的大小&#xff0c;位置和颜色可以展示数据之间的关系。在气泡图中&#xff0c;横轴和纵轴通常表示数据的两个维度&a…