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

news2024/12/23 12:28:59

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 = app

HEADERS:需要包含的头文件的列表。

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/moc
        RCC_DIR = build/x64/tmp_debug/rcc
        UI_DIR = build/x64/tmp_debug/ui
        OBJECTS_DIR = build/x64/tmp_debug/obj
        DESTDIR = build/x64/bin/debug/
    }else{
        MOC_DIR = build/x64/tmp_release/moc
        RCC_DIR = build/x64/tmp_release/rcc
        UI_DIR = build/x64/tmp_release/ui
        OBJECTS_DIR = build/x64/tmp_release/obj
        DESTDIR = build/x64/bin/release/
    }
}else{
    CONFIG(debug,debug|release){
        MOC_DIR = build/x86/tmp_debug/moc
        RCC_DIR = build/x86/tmp_debug/rcc
        UI_DIR = build/x86/tmp_debug/ui
        OBJECTS_DIR = build/x86/tmp_debug/obj
        DESTDIR = build/x86/bin/debug/
    }else{
        MOC_DIR = build/x86/tmp_release/moc
        RCC_DIR = build/x86/tmp_release/rcc
        UI_DIR = build/x86/tmp_release/ui
        OBJECTS_DIR = build/x86/tmp_release/obj
        DESTDIR = 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){  //处理debug
    win32{
    }
    unix{
    	contains(QT_ARCH, arm64){
			message("arm64")
			}else{
			message("x86")
			}
    }
}else{     //处理release
    win32{
    }
    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_MAC
    qputenv("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/release
    UI_DIR = $$PWD/tmp/release/ui
    MOC_DIR = $$PWD/tmp/release/moc
    OBJECTS_DIR = $$PWD/tmp/release/obj
    RCC_DIR = $$PWD/tmp/release/rcc
}
else:win32:CONFIG(debug, debug|release):{
    DESTDIR = $$PWD/debug
    UI_DIR = $$PWD/tmp/debug/ui
    MOC_DIR = $$PWD/tmp/debug/moc
    OBJECTS_DIR = $$PWD/tmp/debug/obj
    RCC_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 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"
}

完整示例
在实际的项目工程文件中,会同时使用操作系统选择、构建类型选择、指定输出目录、编译后命令执行等功能。为了规范多个项目的编译输出框架,可以使用子项目包含的形式。在子项目中制定好编译输出的一般规则,并使多个工程文件都包含同一个子项目(.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 += widgets

unix:QMAKE_CXXFLAGS += -std=c++11
TARGET = EWhalesPluginManager
TEMPLATE = lib
#TEMPLATE = app

CONFIG             += plugin

SOURCES += main.cpp\
    pluginmanager.cpp \
    pluginmanager.settings.cpp \
    pluginmanager.updater.cpp \
    pluginmanager_panel.cpp \
    pluginmanager_panel.uislots.cpp

HEADERS  += \
    ipluginmanager.h \
    pluginmanager.h

FORMS    += \
    pluginmanager_panel.ui

INCLUDEPATH += ../lib
INCLUDEPATH += ../../Plugins

#win32:LIBS             += -lsetupapi -ladvapi32 -luser32

win32 {
    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.qrc

HEADERS += \
    pluginmanager_panel.h

include ($$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 = $$1
    dir = $$2
    # 替换Windows目标路径中的斜杠
    win32:dir ~= s,/,\\,g

    for(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.coloradmin.cn/o/1120462.html

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

相关文章

231022|redis_demo

安装 https://github.com/tporadowski/redis https://github.com/redis/redis-py/ 解压后要先配置redis.windows.conf文件,里面有本地端口和密码设置 默认host:127.0.0.1 port:6379 打开命令行到redis文件夹下,redis-server.exe redis.windows.conf输入即…

1024我来利用DOS攻击你的电脑了?(第十三课)

1024我来利用DOS攻击你的电脑了?(第十三课) 本文章设计安全领域的重点问题 学习本文章时 请扎在初学者的角度学习 用于正途 一 国家安全法 1 安全法律法规 《宪法》中的相关规定 案例: 大山破解同事小美私人邮箱密码,读取其往来邮件 邮箱…

Go并发编程之四

一、前言 今天我们介绍一下Go并发编程另外一个重要概念【多路复用】,多路复用最开始是在网络通讯领域(硬件)应用,指的是用同一条线路承载多路信号进行通信的方式,有频分多路复用、时分多路复用等等技术,然…

组合数(递推版)的初始化

初始考虑为将第一列数和斜对角线上的数进行初始化。 橙色方块由两个绿色方块相加而来,一个为1,一个为0,所以斜对角线都为1,可以通过计算得来,不需要初始化,需要与码蹄集盒子与球 第二类Stirling数&#xf…

【Linux】命令行参数和环境变量

命令行参数 其实main函数是可以传参数的,也叫做命令行参数。我们这里先介绍main函数的前两个参数 argc代表的是指针数组的元素个数,argv是一个指针数组,指针指向字符串。argv不可能为空,argv【0】存储该进程的名字 例如 ls -a -…

【数据结构】830+848真题易错题汇总(10-23)

【数据结构】830848易错题汇总(10-23) 文章目录 【数据结构】830848易错题汇总(10-23)选择题填空题判断题简答题:应用题:算法填空题:算法设计题:(待补) 选择题 1、顺序栈 S 的 Pop(S, e)操作弹出元素 e,则下列(C )是正…

在 Python 中使用 Pillow 进行图像处理【2/4】

第二部分 一、说明 该文是《在 Python 中使用 Pillow 进行图像处理》的第二部分,主要介绍pil库进行一般性处理:如:图像卷积、钝化、锐化、阈值分割。 二、在 Python 中使用 Pillow 进行图像处理 您已经学习了如何裁剪和旋转图像、调整图像大…

Yakit工具篇:专项漏洞检测的配置和使用

简介(来自官方文档) 专项漏洞检测是针对特定应用程序或系统进行的安全漏洞扫描技术,旨在检测与该应用程序或系统相关的安全漏洞。 Yakit通过对常见的中间件、CMS、框架、组件进行总结、归纳,并针对这些组件对其常见的高危漏洞进…

027-第三代软件开发_ComboBox

第三代软件开发_ComboBox 文章目录 第三代软件开发_ComboBox项目介绍ComboBox实际使用 关键字: Qt、 Qml、 ComboBox、 delegate、 Connections 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language&…

试题一 (软件设计师笔记)(15分)

😀前言 现在就是总复习试题一 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csd…

记录打包部署Springboot项目到Windows环境

Springboot项目开发完成后要做的工作就是部署了,这里记录下打包部署的过程。这个项目是一个SpringBoot多模块项目,包含了一个父工程,一个子模块和一个工具模块。其中子模块里有启动类,而工具模块没有。因此这三者的pom文件不一样。…

SOME/IP, DDS 还是 MQTT

如今,用户希望将他们的汽车根据个人偏好进行定制,通过添加功能并定期进行更新,就像他们对待移动设备一样。实现这些期望属性的一个构建模块是基于 Internet Protocol(IP)的通信;IP为新的设计模式打开了大门…

arcgis js api 4.x加载geoserver发布的地方坐标系(自定义坐标系)的wms服务

问题描述:之前研究过arcgis js api 4.x加载arcgis server 发布的地方坐标系的wms服务,后来研究出来能正常加载了,想了解的可以看我之前的博客。但是一直困于加载geoserver发布的地方坐标系的wms服务,一直都是用的WMSLayer这个调用…

1024渗透OpenVas扫描工具使用(第十四课)

1024渗透扫描工具使用(第十四课) 一 漏洞披露 1 微软安全更新指南(自2017年2月起,替代安全公告) 安全公告都有一个惟一的编号 其命名规则是:MS年份-补丁序号 或 CVE-年份-补丁序号 比如MS17-010就表示2017年发布的编号为010的安…

自然语言处理---Transformer构建语言模型

语言模型概述 以一个符合语言规律的序列为输入,模型将利用序列间关系等特征,输出一个在所有词汇上的概率分布,这样的模型称为语言模型。 # 语言模型的训练语料一般来自于文章,对应的源文本和目标文本形如: src1 "I can do&…

【剑指Offer】34.二叉树中和为某一值的路径(二)

题目 输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 2.叶子节点是指没有子节点的节点 3.路径只能从父节点到子节点,不能从…

运维:mysql常用的服务器状态命令

目录 1、查询当前服务器运行的进程 2、查询最大链接数 3、查询当前链接数 4、展示当前正在执行的sql语句 5、查询当前MySQL当中记录的慢查询条数 6、展示Mysql服务器从启动到现在持续运行的时间 7、查询数据库存储占用情况 8、查询服务器启动以来的执行查询的总次数 9…

算法通关村第十关黄金挑战——归并排序详解

大家好,我是怒码少年小码。 归并排序 就是将一个大的序列分为多个小的序列,对小的序列排序,最后利用归并的思想合并序列。归并排序的思想就是分而治之。 分:将大序列分为很多个小的序列 治:将多个小的序列合并为大序…

用 pytorch 训练端对端验证码识别神经网络并进行 C++ 移植

文章目录 前言安装安装 pytorch安装 libtorch安装 opencv(C) 准备数据集获取训练数据下载标定 编码预分析 数据集封装格式 神经网络搭建神经网络训练神经网络测试神经网络预测C 移植模型转换通过跟踪转换为 Torch Script通过注解转换为 Torch Script 编写…

解决 Element-ui中 表格(Table)使用 v-if 条件控制列显隐时数据展示错乱的问题

本文 Element-ui 版本 2.x 问题 在 el-table-column 上需根据不同 v-if 条件来控制列显隐时&#xff0c;就会出现列数据展示错乱的情况&#xff08;要么 A 列的数据显示在 B 列上&#xff0c;或者后端返回有数据的但是显示的为空&#xff09;&#xff0c;如下所示。 <tem…