QT判断平台和生成版本设置输入目录

QT判断平台和生成版本设置输入目录

  • pro工程文件中常用的宏定义
  • Chapter1 QT判断平台和生成版本设置输入目录
  • Chapter2 Qt pro文件中判断 x86/arm(aarch64)交叉编译环境,区分 linux/windows系统, debug/release版本
  • Chapter3 Qt的版本判断、跨平台选择与pro工程文件输出设定($$$)
  • Chapter4 QT改变EXE生成路径,增加EXE图标,指定生成的EXE名称
  • Chapter5 Qt 修改pro文件可以将生成exe或dll文件复制到多个地方


在这里插入图片描述
个人写的一些简单工程配置项目

#//统一Windows平台的方法
win32 {CONFIG(debug,debug|release){ #debug
OBJECTS_DIR = $$PWD/../bin_mingw32_debug/objs
DESTDIR = $$PWD/../bin_mingw32_debug
}else{ #release
OBJECTS_DIR = $$PWD/../bin_mingw32_release/objs
DESTDIR = $$PWD/../bin_mingw32_release
}}#//仅msvc编译器
win32-msvc*{
DESTDIR += $$PWD/../bin_msvc
}

pro工程文件中常用的宏定义

TEMPLATE = appHEADERS:需要包含的头文件的列表。SOURCES:需要的源文件的列表。FORMS:需要的.ui文件的列表。LEXSOURCES:所有lex源文件的列表。YACCSOURCES:所有yacc源文件的列表。TARGET:可执行应用程序的名称。默认值为项目文件的名字。DESTDIR:放置可执行程序目标的目录。OBJECTS_DIR:放置obj中间文件的目录。MOC_DIR: moc转换文件路径。RCC_DIR: 资源文件路径。UI_DIR:ui文件转换的路径。RESOURCES:需要包含的资源文件。LIBS:依赖库的路径和名称 -L{xxdirxx} -l{xxnamexx}。LIBEXT: 产生lib的后缀。DEFINES:应用程序所需的额外的宏定义列表。INCLUDEPATH:应用程序所需的额外的包含路径列表。DEPENDPATH:应用程序所依赖的搜索路径。VPATH:寻找补充文件的搜索路径。DEF_FILE:只有Windows需要:应用程序所要连接的.def文件。RC_FILE:只有Windows需要:应用程序的资源文件。RES_FILE:只有Windows需要:应用程序所要连接的资源文件。TRANSLATIONS: 多国语言支持文件。INSTALLS: 要安装的文件。target.path: 安装的路径。

Chapter1 QT判断平台和生成版本设置输入目录

在pro文件添加

greaterThan(QT_MAJOR_VERSION,4){TARGET_ARCH=$${QT_ARCH}
}else{TARGET_ARCH=$${QMAKE_HOST.arch}
}
contains(TARGET_ARCH, x86_64){CONFIG(debug,debug|release){MOC_DIR = build/x64/tmp_debug/mocRCC_DIR = build/x64/tmp_debug/rccUI_DIR = build/x64/tmp_debug/uiOBJECTS_DIR = build/x64/tmp_debug/objDESTDIR = build/x64/bin/debug/}else{MOC_DIR = build/x64/tmp_release/mocRCC_DIR = build/x64/tmp_release/rccUI_DIR = build/x64/tmp_release/uiOBJECTS_DIR = build/x64/tmp_release/objDESTDIR = build/x64/bin/release/}
}else{CONFIG(debug,debug|release){MOC_DIR = build/x86/tmp_debug/mocRCC_DIR = build/x86/tmp_debug/rccUI_DIR = build/x86/tmp_debug/uiOBJECTS_DIR = build/x86/tmp_debug/objDESTDIR = build/x86/bin/debug/}else{MOC_DIR = build/x86/tmp_release/mocRCC_DIR = build/x86/tmp_release/rccUI_DIR = build/x86/tmp_release/uiOBJECTS_DIR = build/x86/tmp_release/objDESTDIR = build/x86/bin/release/}
}

Chapter2 Qt pro文件中判断 x86/arm(aarch64)交叉编译环境,区分 linux/windows系统, debug/release版本

原文链接

TARGET:这个配置项用来指定最后生成的目标应用程序的名称。DESTDIR:设置目标文件的输出目录(如exe或lib文件)。OBJECTS_DIR:放置obj中间文件的目录。MOC_DIR: moc转换文件的路径。RCC_DIR: 资源文件的路径。UI_DIR:ui文件转换的路径。

使用的arm编译器为aarch64, 很多博客都是使用 QMAKE_HOST.arch 进行判断,但这并不能分辨出 aarch64 编译器,有的更离谱的是定义一个函数,实在让人无言,自行尝试解决方案如下:

contains(QT_ARCH, arm64){
message("arm64") #在这里处理arm64所需
}else{
message("x86")
}

linux/windows 区分:

win32{
//do something...
}
unix{
//do something...
}

debug / release 区分:

CONFIG += debug_and_release
CONFIG(debug, debug|release){  //处理debug
}else{  //处理release
}

都可以组合使用,如:

CONFIG += debug_and_release
CONFIG(debug, debug|release){  //处理debugwin32{}unix{contains(QT_ARCH, arm64){message("arm64")}else{message("x86")}}
}else{     //处理releasewin32{}unix{}
}

若根据某些宏是否存在来执行不同的配置则可以:

添加宏定义:

DEFINES += TEST

判断宏定义是否存在

contains(DEFINES, TEST) {message('-->>(DEFINES, TEST)')
} else {message('-->>not contains (DEFINES, TEST)')
}

Chapter3 Qt的版本判断、跨平台选择与pro工程文件输出设定($$$)

原文链接:https://blog.csdn.net/u013441358/article/details/123843735

跨平台代码
在Pro文件中区分
在工程文件中,使用unix、win32、macx等标号区分不同的平台。可以使用标号+冒号的形式指定单行内容在特定平台生效,也可以使用大括号选择多行内容在特定平台生效。注意使用多行选择时,左大括号和平台名需要在同一行中,否则会失效。

windows平台多行写法示例:

//统一Windows平台的方法
win32 {}//仅msvc编译器
win32-msvc*{}

Linux或unix平台多行写法示例:

统一Linux或unix平台写法
unix {}//仅g++编译器
linux-g++*{}

macOS平台多行写法示例:

macx {}macx:qesp_mac_framework {}

需要特别注意的是,macOS平台也是unix平台的一种,因此上述Linux或unix平台写法也包含了macOS系统。如果要指定非macOS系统的Unix平台,那么需要使用如下写法:

unix:!macx {}

在代码中区分
使用宏定义选择不同平台进行条件编译。不同平台的宏定义使用示例如下:

#if defined Q_OS_DARWIN     //Q_OS_MACqputenv("QT_MAC_WANTS_LAYER", "1");
#elif defined Q_OS_LINUX    //Q_OS_LINUX#elif defined Q_OS_WIN32    // Q_OS_WIN32#else#endif

pro工程输出
Release与Debug控制
Release编译与Debug编译的选择同样分为单行指定和多行指定。单行指定的示例如下:

CONFIG(debug, debug|release):LIBS += -L../lib1 -lhellod
CONFIG(release, debug|release):LIBS += -L../lib2 -lhello

多行指定的示例如下:

CONFIG(debug, debug|release){} else {}

之所以采用CONFIG(debug, debug|release)这样的写法,主要是因为要确保只能有一个条件处于active的状态。两个参数,前者是要判断的active的选项,后者是互斥的选项的一个集合。

Qt Creator的构建配置中除了Debug与Release之后,还有Profile。Qt在qmake项目.pro文件时,会将Profile配置视作Release配置解析。

编译生成文件

TARGET:这个配置项用来指定最后生成的目标应用程序的名称。

DESTDIR:设置目标文件的输出目录(如exe或lib文件)。

OBJECTS_DIR:放置obj中间文件的目录。

MOC_DIR: moc转换文件的路径。

RCC_DIR: 资源文件的路径。

UI_DIR:ui文件转换的路径。

使用示例1:

win32:CONFIG(release, debug|release):{DESTDIR = $$PWD/releaseUI_DIR = $$PWD/tmp/release/uiMOC_DIR = $$PWD/tmp/release/mocOBJECTS_DIR = $$PWD/tmp/release/objRCC_DIR = $$PWD/tmp/release/rcc
}
else:win32:CONFIG(debug, debug|release):{DESTDIR = $$PWD/debugUI_DIR = $$PWD/tmp/debug/uiMOC_DIR = $$PWD/tmp/debug/mocOBJECTS_DIR = $$PWD/tmp/debug/objRCC_DIR = $$PWD/tmp/debug/rcc
}

使用示例2:

CONFIG(debug, debug|release) {build_type = debug
} else {build_type = release
}DESTDIR     = $$build_type/out
OBJECTS_DIR = $$build_type/obj
MOC_DIR     = $$build_type/moc
RCC_DIR     = $$build_type/rcc
UI_DIR      = $$build_type/ui

执行系统命令
使用**QMAKE_PRE_LINK和QMAKE_POST_LINK定义需要在编译前与编译后需要执行的系统命令。一般可以利用此功能将一些依赖的头文件、库文件等复制到指定的目录中。**执行多条系统命令时,从第二条命令开始要加上“&&”作为分隔,否则会导致命令执行失败。示例如下:

win32 {QT_PROJ_ROOTDIR = E:/Working/QtDev# Copy the interface file of the plugin to the folderInterfaceFile = $$PWD/ipluginmanager.h# 将LibFile中的"/"替换为"\"InterfaceFile = $$replace(InterfaceFile, /, \\)# Copy the library of the plugin to the folderLibraryFile = $$DESTDIR/EWhalesPluginManager.dll# 将LibFile中的"/"替换为"\"LibraryFile = $$replace(LibraryFile, /, \\)# 输出目录也是一样,要将"/"替换为"\"OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/OutLibFile = $$replace(OutLibFile, /, \\)QMAKE_POST_LINK += "copy $$InterfaceFile $$OutLibFile"QMAKE_POST_LINK += "&& copy $$LibraryFile $$OutLibFile"
}

完整示例
在实际的项目工程文件中,会同时使用操作系统选择、构建类型选择、指定输出目录、编译后命令执行等功能。为了规范多个项目的编译输出框架,可以使用子项目包含的形式。在子项目中制定好编译输出的一般规则,并使多个工程文件都包含同一个子项目(.pri文件)。以下提供一个来源于真实项目的完整示例。

通用子项目文件

CONFIG(debug, debug|release) {build_type = debug
} else {build_type = release
}DESTDIR     = ../output/$$build_type
OBJECTS_DIR = ./$$build_type/obj
MOC_DIR     = ./$$build_type/moc
RCC_DIR     = ./$$build_type/rcc
UI_DIR      = ./$$build_type/ui# 指的是当前正在解析的.pro文件的目录的完整路径。 
# 在编写支持影子构建的项目文件时,PWD很有用。
message(PWD is: $$PWD)
# 指的是qmake生成的Makefile的目录的完整路径,即构建目录。
# 例如build-??-Desktop_Qt_5_12_8_MSVC2017_64bit-Debug
message(OUT_PWD is: $$OUT_PWD)
# 正在使用的项目文件的路径
message(_PRO_FILE_ is: $$_PRO_FILE_)
# 包含目录的路径,该目录包含正在使用的项目文件
message(_PRO_FILE_PWD_ is: $$_PRO_FILE_PWD_)

具体工程文件

include(./ewhales_qt.pri)QT       += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsunix:QMAKE_CXXFLAGS += -std=c++11
TARGET = EWhalesPluginManager
TEMPLATE = lib
#TEMPLATE = appCONFIG             += pluginSOURCES += main.cpp\pluginmanager.cpp \pluginmanager.settings.cpp \pluginmanager.updater.cpp \pluginmanager_panel.cpp \pluginmanager_panel.uislots.cppHEADERS  += \ipluginmanager.h \pluginmanager.hFORMS    += \pluginmanager_panel.uiINCLUDEPATH += ../lib
INCLUDEPATH += ../../Plugins#win32:LIBS             += -lsetupapi -ladvapi32 -luser32win32 {QT_PROJ_ROOTDIR = E:/Working/QtDev#### Copy the interface file of the plugin to the folder ####InterfaceFile = $$PWD/ipluginmanager.h# 将LibFile中的"/"替换为"\"InterfaceFile = $$replace(InterfaceFile, /, \\)#### Copy the library of the plugin to the folder ####LibraryFile = $$DESTDIR/EWhalesPluginManager.dll# 将LibFile中的"/"替换为"\"LibraryFile = $$replace(LibraryFile, /, \\)# 输出目录也是一样,要将"/"替换为"\"OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/OutLibFile = $$replace(OutLibFile, /, \\)QMAKE_POST_LINK += "copy $$InterfaceFile $$OutLibFile"QMAKE_POST_LINK += "&& copy $$LibraryFile $$OutLibFile"
}unix:!macx {QT_PROJ_ROOTDIR = /home/alwhales/QtDev#### Copy the interface file of the plugin to the folder ####InterfaceFile = $$PWD/ipluginmanager.h#### Copy the library of the plugin to the folder ####LibraryFile = $$DESTDIR/libEWhalesPluginManager.so# 输出目录也是一样,要将"/"替换为"\"OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/QMAKE_POST_LINK += "cp $$InterfaceFile $$OutLibFile"QMAKE_POST_LINK += "&& cp $$LibraryFile $$OutLibFile"
}macx {QT_PROJ_ROOTDIR = /Users/wangtao/QtProj#### Copy the interface file of the plugin to the folder ####InterfaceFile = $$PWD/ipluginmanager.h#### Copy the library of the plugin to the folder ####LibraryFile = $$DESTDIR/libEWhalesPluginManager.dylib# 输出目录也是一样,要将"/"替换为"\"OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/QMAKE_POST_LINK += "cp $$InterfaceFile $$OutLibFile"QMAKE_POST_LINK += "&& cp $$LibraryFile $$OutLibFile"
}RESOURCES += \resource.qrcHEADERS += \pluginmanager_panel.hinclude ($$PWD/update_tool/qsimpleupdater/QSimpleUpdater.pri)

最终的项目目录结构为:
在这里插入图片描述
参考链接1:关于Qt Creator项目中.pro文件中的相对路径

参考链接2:Qt Creator指定临时文件生成目录(MOC_DIR/RCC_DIR等)和PWD/OUT_PWD/.pro官方文档

Chapter4 QT改变EXE生成路径,增加EXE图标,指定生成的EXE名称

原文链接:https://blog.csdn.net/qq_28178271/article/details/131879509

Chapter5 Qt 修改pro文件可以将生成exe或dll文件复制到多个地方

原文链接:https://blog.csdn.net/hss2799/article/details/125299326

直接上代码,在pro文件里面添加

# 将给定文件复制到目标目录,相当于一个函数
defineTest(copyToDestDir) {files = $$1dir = $$2# 替换Windows目标路径中的斜杠win32:dir ~= s,/,\\,gfor(file, files) {# 替换Windows源路径中的斜杠win32:file ~= s,/,\\,g# 复制命令QMAKE_POST_LINK += $$QMAKE_COPY $$shell_quote($$file) $$shell_quote($$dir) $$escape_expand(\\n\\t)}export(QMAKE_POST_LINK)
}
#需要复制的文件清单,可以是exe,可以是dll,或其他的
FROM_FILES += \$$PWD/../bin/UP5000/StartScreen.exe\$$PWD/../bin/UP5000/test.lib\$$PWD/../bin/UP5000/other.dll#复制到指定文件夹
copyToDestDir($$FROM_FILES, $$PWD/../bin/UP5500/)
copyToDestDir($$FROM_FILES, $$PWD/../bin/UR6000/)
copyToDestDir($$FROM_FILES, $$PWD/../bin/UR8000/)

FROM_FILES
是需要复制的源文件清单

$$PWD/…/bin/UP5500/
是复制的目标路径,根据自己的需要,进行调整

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

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

相关文章

2015款MacBook Pro从Big Sur升级到Monterey

机器信息 存储是1TB的固态硬盘。 升级后的使用体验 开机速度 比之前Big Sur系统开机时间快了至少三分之一(进入系统的进度条停顿时间很短,未升级之前,进度条加载缓慢,动不动就停顿半天) 应用app使用情况 从Big Su…

CANoe-使用IG Ethernet Packet Builder实现IP包分片的若干问题

在文章《CANoe-Ethernet IG和Ethernet Packet Builder的使用和区别》中,我们讲过Packet Builder可以组装多种类型的以太网报文: 当我们想组装一条icmpv4 echo request报文,payload只有1个字节的数据FF时,选择ICMPv4 Packet,创建一条ICMPv4报文,把payload改为1个字节: 然…

【Javascript】数组练习(在排好序的数组⾥,按照⼤⼩顺序插⼊数据)

var array[1,4,5,7,9,17]; console.log(array);比如要插入一个数16 var array[1,4,5,7,9,17];var num16; var indexnull; var i; for(i0;i<array.length;i){if(array[i]<num){indexi;} } console.log(index);首先通过循环找出最后一个比自定义的num小的值&#xff0c;并…

Maven3.9.2 bug IDEA指定配置文件不生效

Maven3.9.2 bug IDEA指定配置文件不生效 描述 运行新项目需要配置指定的settings.xml文件&#xff0c;一直报错找不到依赖&#xff0c;查看maven日志是从maven中心仓库找的依赖&#xff0c;自然找不到。 解决过程 清理idea缓存&#xff0c;仍然报错 删除/${username}/.m2/…

仿写知乎日报第一周

效果图 主要的逻辑 Manager封装网络请求 首先&#xff0c;对于获取网络请求&#xff0c;我是将这些方法封装成了一个类Manager&#xff0c;后续在获取以往的内容时又封装了一个beforeManager类用于网络请求。这里不多赘述&#xff0c;Manager封装网络请求的知识参考我的以往博…

kaggle新赛:UBC卵巢癌亚型分类和异常检测大赛【图像分类】

赛题名称&#xff1a;UBC Ovarian Cancer Subtype Classification and Outlier Detection (UBC-OCEAN) 赛题链接&#xff1a;https://www.kaggle.com/competitions/UBC-OCEAN 赛题背景 卵巢癌是女性生殖系统最致命的癌症。目前&#xff0c;卵巢癌诊断依赖病理学家评估亚型。…

为1024征文活动用心用意而写的文稿

现在我在听的歌&#xff0c;名叫《Loser》。相信你可能听过&#xff0c;Bigbang的。里面有句歌词是这样的&#xff1a;把手伸了出来&#xff0c;却没有任何人握住我的手。不管生活怎样&#xff0c;希望看到这篇文章的你&#xff0c;可以带着自己和带着自己的倔强&#xff0c;一…

B-tree(PostgreSQL 14 Internals翻译版)

概览 B树(作为B树访问方法实现)是一种数据结构&#xff0c;它使您能够通过从树的根向下查找树的叶节点中所需的元素。为了明确地标识搜索路径&#xff0c;必须对所有树元素进行排序。B树是为有序数据类型设计的&#xff0c;这些数据类型的值可以进行比较和排序。 下面的机场代…

二叉树题目:最大二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;最大二叉树 出处&#xff1a;654. 最大二叉树 难度 5 级 题目描述 要求 给定一个没有重复元素的整数数组 num…

Ubuntu OpenLDAP配置笔记

Ubuntu OpenLDAP配置笔记 问题&#xff08;需求&#xff09;LDAP服务端安装slapd和ldap-utils配置域名编辑hosts修改主机名验证增加一个域账号修改用户的密码 Linux桌面加域安装软件验证允许远程账号首次登录时自动创建HOME目录桌面登录 其它问题Ubuntu更新和安装太慢LDAP服务端…

推荐一款支持异步批量下载图片的chrome插件——图片助手(ImageAssistant) 批量图片下载器

https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko/related?hlzh-CNhttps://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko/related?hlzh-CN 安装后直接点击 会根据…

分治法,动态规划法,贪心法,回溯法主要概括

目录 分治法&#xff0c;动态规划法&#xff0c;贪心法&#xff0c;回溯法主要概括 1.前言2.分治法2.1基本思想&#xff1a;2.2适用条件&#xff1a;2.3时间复杂度&#xff1a;2.4主要解决&#xff1a;2.5关键字&#xff1a;2.6其他&#xff1a; 3.动态规划法3.1基本思想&…

强化学习问题(7)--- Python和Pytorch,Tensorflow的版本对应

1.问题 之前下载的python3.8&#xff0c;在对应Pytorch和Tensorflow时没太在意版本&#xff0c;在运行一些代码时&#xff0c;提示Pytorch和Tensorflow版本过高&#xff0c;直接降下来&#xff0c;有时候又和Python3.8不兼容&#xff0c;所以又在虚拟环境搞一个Pyhon3.7&#x…

JAVA毕业设计101—基于Java+Springboot的电影购票微信小程序带后台管理(源码+数据库)

基于JavaSpringboot的电影购票微信小程序带后台管理(源码数据库)101 一、系统介绍 本系统是小程序前台&#xff0c;带后台管理 本系统分为管理员、用户两种角色 管理员功能&#xff1a; 登录、统计分析、密码修改、用户管理、广告管理、影院管理、分类管理、电影管理、场次…

babel6使用ES2020最新js语法

babel6使用ES2020最新js语法 Babel 6 原本是不支持 ES2020 语法&#xff0c;因为它是在 Babel 7 中引入的。如果您想使用 ES2020 语法&#xff0c;您需要将 Babel 6 升级到 Babel 7 或更高版本(推荐),当然也可以在bebel6中安装支持某个语法的plugin,比如你想使用 ES2020 中的可…

UI自动化测试,让测试高效起来

RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度可复用的测试脚本&#xff0c;测试团队无需复杂的代码编写即可开展低代码的自动化…

【算法设计】递归与分治算法设计——二分搜索、假币识别问题(C++实现)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法分析与设计知识专栏&#xff1a;算法分析&#x1f525; 给大家跳…

数字化驱动基础网络建设升级:实现高效信息传输的关键

随着科技的飞速发展&#xff0c;数字化驱动基础网络建设升级已成为当今社会的重要议题。信息传输的高效性和安全性对于现代社会的发展至关重要。本文将深入探讨数字化驱动基础网络建设升级的重要性、现状、升级措施以及未来发展趋势&#xff0c;旨在为相关领域提供有益的参考。…

“中国版Zara”拉夏贝尔:从辉煌到破产清算

文/ 大力财经 拉夏贝尔的破产清算&#xff0c;让人不禁惋惜。这个曾经被誉为“中国版Zara”的女装品牌&#xff0c;在全国拥有超过2000家门店&#xff0c;一度是年轻人的追捧对象。 然而&#xff0c;由于市场竞争激烈、品牌定位模糊、库存积压严重等问题&#xff0c;拉夏贝尔…