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

news2024/10/5 12:44:45

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSPF网络类型实验2

对R4 对R5,找R1注册 对R1宣告环回,再宣告一下tunnel接口 本实验不考虑区域划分 现在已经全部宣告完成 对R1,2,3改接口 broadcast工作方式hello时间10s,然后进行dr选举,由于2,3之间没有伪广播 …

【探索数据结构】线性表之双链表

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C和数据结构怀有无限热忱的探索者。🙌 🌸🌸🌸这里是我分享C/C编程、数据结构应用的乐园✨ 🎈🎈&…

乡村振兴的农业品牌建设:打造农业品牌,提升农产品附加值,增强乡村经济竞争力,实现美丽乡村经济繁荣

目录 一、引言 二、农业品牌建设的重要性 (一)提升农产品附加值 (二)增强乡村经济竞争力 (三)实现美丽乡村经济繁荣 三、农业品牌建设的现状及问题 (一)现状 (二…

Go微服务: Nacos的搭建和基础API的使用

Nacos 概述 文档:https://nacos.io/docs/latest/what-is-nacos/搭建:https://nacos.io/docs/latest/quickstart/quick-start-docker/有很多种搭建方式,我们这里使用 docker 来搭建 Nacos 的搭建 这里,我们选择单机模式&#xf…

java实现图书系统源码

建包和类: Book Book: package Book;public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;public Book(String name, String author, int price, String type) {this.name name;this.author …

【Qnx 】Qnx IPC通信PPS

Qnx IPC通信PPS Qnx自带PPS服务,PPS全称Persistent Publish/Subscribe Service,就是常见的P/S通信模式。 Qnx PPS的通信模式是异步的,Publisher和Subscriber也无需关心对方是否存在。 利用Qnx提供的PPS服务,Publisher可以通知多…

OrangePi KunPengPro | 开发板开箱测评之学习与使用

OrangePi KunPengPro | 开发板开箱测评之学习与使用 时间:2024年5月23日20:51:12 文章目录 OrangePi KunPengPro | 开发板开箱测评之学习与使用概述1.参考2.资料、工具3.使用3-1.通过串口登录系统3-2.通过SSH登录系统3-3.安装交叉编译工具链3-4.复制文件到设备3-5.第…

Android 使用 ActivityResultLauncher 申请权限

前面介绍了 Android 运行时权限。 其中,申请权限的步骤有些繁琐,需要用到:ActivityCompat.requestPermissions 函数和 onRequestPermissionsResult 回调函数,今天就借助 ActivityResultLauncher 来简化书写。 步骤1:创…

攻防世界[GoodRe]

攻防世界[GoodRe] 学到知识: 逆向的精髓:三分懂,七分蒙。TEA 算法快速识别(蒙): 数据处理的形式:进入加密时的数据和加密结束后的数据,处理时数据的分组等等,都能用来…

AtCoder Beginner Contest 355 A~F

A.Who Ate the Cake?(思维) 题意 已知有三个嫌疑人,有两个证人,每个证人可以指出其中一个嫌疑人不是罪犯,如果可以排除两个嫌疑人来确定犯人,输出犯人的身份,如果无法确定,输出"-1"。 分析 …

Pytorch(Overview)

目标 如何利用pytorch完成学习系统? 理解神经网络(neural networks)和深度学习(deep learning)基础。 需要了解线性代数和概率论数理统计等相关关系,和python编程语言。 讨论理解 到底什么是human int…

vue3项目+TypeScript前端项目 ———— elemnet-plus,svg图标配置,sass,mock数据

一.集成element-plus 官网地址 安装 pnpm install element-plus 引入 // main.ts import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vueconst app createApp(App)app.use(ElementPlus) app.…

esp32-idf 开发踩坑记录

现象 直接使用原始命令编译idf.py build 但是提示idf 版本错误 卸载旧版本 编译出错build 问题 然后删除编译文件后,重新编译,还是出错 解决方法1 最后发现是因为项目所在文件夹有中文目录,把项目迁移到英文目录后,重新编译&a…

重学java 46.集合 ① Collection集合

事常与人违,事总在人为 —— 24.5.26 集合 知识导航 1.集合的特点以及作用 2.使用collection接口中的方法 3.使用迭代器迭代集合 4.ArrayList以及LinkedList的使用 5.使用增强for遍历集合 一、单列集合框架的介绍 1.长度可变的容器:集合 2.集合的特点 a.…

TCP/IP协议(一)

一.报文和协议 协议有什么作用?协议定义通信实体间所交换报文的格式和次序,以及在报文发送和/或接收或者其他事件方面所采取的行动(响应)。 什么是报文?指在网络中传输的数据单元,网络通讯的基本单位。(HTTP报文、TCP报…

录屏技巧:win11怎么录屏?这5个电脑录屏方法快速了解下

无论您是想进行工作演示还是游戏直播,电脑录屏都有很大帮助。录制 Win 11 屏幕在很多方面都非常有效,因为它能让事情变得更简单。但 Win11怎么录屏呢?如果您仍有困惑,请查看本篇文章中列出的5个方法。在本文中,我们列出…

Python 获取当前IP地址(爬虫代理)

Python 获取当前IP地址(爬虫代理) 在Python中,获取当前的公网IP地址通常涉及到发送一个请求到外部服务,因为本地IP地址通常只在你的私有网络内部是可见的,而公网IP地址是由你的ISP(互联网服务提供商&#x…

猫抓(cat-catch)插件的常规用法

目录 1.1、前言1.2、抓取图片资源1.3、抓取音频资源1.4、抓取视频资源 1.1、前言 本文将介绍利用猫抓(cat-catch)插件如下抓取网页上的图片、音频、视频等资源,猫抓(cat-catch)插件的安装及设置请参考推荐一款媒体影音…

【网络技术】【Kali Linux】Wireshark嗅探(十五)SSDP(简单服务发现协议)报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客: 【网络技术】【Kali Linux】Wireshark嗅探(一)ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探(二)TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

picamera配opencv做发现移动物体后录像50秒

本来是想配合上一篇写的测距传感器数据打开摄像头录制个50秒实时画面,后来这个测距传感器(因为我是歪用,用来识别范围内的移动物体)给的数据,false alarming还是太高了。于是想到使用本人之前深恶痛绝的opencv来试一试…