【Qt QML】用CMake管理Qt工程

CMake是一个开源、跨平台的工具系列,用于构建、测试和打包软件。CMake使用简单的独立配置文件来控制软件编译过程。与许多跨平台系统不同,CMake被设计为与本地构建环境结合使用。
下面我们在CMake项目中使用Qt的最基本方法。首先,创建一个基本的控制台应用程序。然后,将该项目扩展为使用Qt Widgets的GUI应用程序。

一、用CMake构建控制台应用程序,构建系统选择CMake(Qt6支持)

在这里插入图片描述
Qt Creator为我们自动生成了一个CMakeList.txt,如图:

在这里插入图片描述
CMakeList.txt是CMake项目的核心配置文件,位于项目根目录下,用于定义项目的构建规则和配置选项。通过编写CMake语法,可以在CMakeList.txt中定义项目名称、需要的源文件、依赖项、编译标志、安装规则等。这样可以实现跨平台的项目构建和管理,提供了灵活性和可扩展性。工程中自动生成的CMakeList内容如下:

cmake_minimum_required(VERSION 3.14)         #指定构建应用程序最低的CMake版本,通常放在CMakeList最开始

project(TestCMakeConsole LANGUAGES CXX)      #设定项目名称和默认版本,Languages参数用来告诉CMake程序是用C++写的

#用来告诉CMake工具自动处理UI文件、MOC文件和资源文件的指令
set(CMAKE_AUTOUIC ON)                       #开启自动生成UI头文件的功能,即对应UI文件(.ui)会生成对应的UI头文件,无需手动编写
set(CMAKE_AUTOMOC ON)                       #开启自动生成MOC文件的功能,即处理带有Q_OBJECT宏的QObject派生类的头文件,生成相应的MOC文件。MOC (Meta-Object Compiler) 是用于处理信号槽机制的工具
set(CMAKE_AUTORCC ON)                       #开启自动生成资源文件的功能,即处理.qrc文件,生成相应的资源文件

set(CMAKE_CXX_STANDARD 17)                  #指定需要C++17或者高的编译器支持
set(CMAKE_CXX_STANDARD_REQUIRED ON)         #强制指定编译器支持,如果编译器太旧,CMake将打印错误

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)            #查找Qt5或Qt6并导入Core模块,Required参数标志是告诉CMake这种查找是强制的,如果没找到则中止
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)       #强制指定到的Qt版本是由QT_VERSION_MAJOR参数指定的版本,找到后导入Core模块

add_executable(TestCMakeConsole             #告诉CMake我们想要构建一个名为TestCMakeConsole的可执行文件作为目标。目标应该从c++源文件main.cpp构建。注意,这里通常不列出头文件。
  main.cpp
)
target_link_libraries(TestCMakeConsole Qt${QT_VERSION_MAJOR}::Core)   #告诉CMake, TestCMakeConsole可执行文件通过引用上面find_package()调用导入的Qt6::Core目标来使用Qt Core。

include(GNUInstallDirs)                     #包含GNUInstallDirs模块,它定义了一些安装目录变量,方便在后续的安装过程中使用

#指定了一个名为TestCMakeConsole的目标,指定了在安装时将该目标生成的库文件安装到${CMAKE_INSTALL_LIBDIR}目录下,将生成的可执行文件安装到${CMAKE_INSTALL_BINDIR}目录下。
#这样可以确保在安装项目时,生成的文件会被安装到正确的目录下。
install(TARGETS TestCMakeConsole
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

二、用CMake构建GUI应用程序

在这里插入图片描述
同样,我们继续分析Qt Creator为Demo工程自动生成的CMakeList.txt。

cmake_minimum_required(VERSION 3.5)     #指定构建应用程序最低的CMake版本为3.5,通常放在CMakeList最开始

project(testCMakeGui VERSION 0.1 LANGUAGES CXX)   #设定项目名称和默认版本,Languages参数用来告诉CMake程序是用C++写的

set(CMAKE_AUTOUIC ON)                   #见上文
set(CMAKE_AUTOMOC ON)                   #见上文
set(CMAKE_AUTORCC ON)                   #见上文

set(CMAKE_CXX_STANDARD 17)              #见上文
set(CMAKE_CXX_STANDARD_REQUIRED ON)     #见上文

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)             #见上文,不同的是基于QWidget的GUI应用我们需要导入Widgets模块
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)        #见上文

set(PROJECT_SOURCES                     #通过设置PROJECT_SOURCES变量来指定项目所需的所有源文件。这些源文件将在项目构建时被编译并链接到可执行文件中。
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
)

#首先检查 Qt 版本是否大于或等于 6。如果是,则使用 qt_add_executable() 函数来创建一个名为 testCMakeGui 的可执行文件,指定 MANUAL_FINALIZATION,并包含之前定义的项目源文件列表。
#如果 Qt 版本是 6,还会有一个注释部分,说明如何在 Android 下为 testCMakeGui 定义属性。该注释提供了一个 set_property() 调用的示例,用于指定 QT_ANDROID_PACKAGE_SOURCE_DIR。
#如果 Qt 版本小于6,代码将进入 else 分支。在此分支中,会检查是否为 Android 平台。如果是 Android 平台,将使用 add_library() 函数创建一个名为 testCMakeGui 的共享库(SHARED),并包含项目源文件列表。
#同样也有一个注释,用于定义 Qt 5 中 Android 平台的属性设置。
#如果不是 Android 平台,将使用 add_executable() 函数创建一个名为 testCMakeGui 的可执行文件,并包含项目源文件列表。
#这段代码根据 Qt 版本和平台类型选择不同的构建方式,并为每种情况定义了相应的属性。这样可以确保项目在不同的环境和版本下都能正确构建。
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(testCMakeGui
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
         )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET testCMakeGui APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(testCMakeGui SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(testCMakeGui
            ${PROJECT_SOURCES}
        )
    endif()
endif()

#确保了 testCMakeGui 目标可以访问并使用 Qt Widgets 模块中的功能,这样在构建和运行项目时就能正确地链接和使用 Qt 组件
target_link_libraries(testCMakeGui PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
#在 Qt 6.1 及以后的版本中,Qt for iOS会自动设置MACOSX_BUNDLE_GUI_IDENTIFIER,但如果Qt版本低于6.1.0,则需要手动设置一个固定的Bundle Identifier,以确保应用程序在macOS上正确识别和管理。
#默认的Bundle Identifier设置为com.example.testCMakeGui,可以根据需要修改。
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.testCMakeGui)
endif()

#通过set_target_properties函数设置了testCMakeGui目标的属性。其中,${BUNDLE_ID_OPTION}是之前定义的用于设置Bundle Identifier的变量。
#另外,MACOSX_BUNDLE_BUNDLE_VERSION被设置为项目版本,MACOSX_BUNDLE_SHORT_VERSION_STRING被设置为项目主版本号和次版本号的组合。MACOSX_BUNDLE属性被设置为TRUE,表示当前目标是一个macOS bundle。
#WIN32_EXECUTABLE属性被设置为TRUE,表示当前目标是一个Win32可执行程序。
set_target_properties(testCMakeGui PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

#见上文
include(GNUInstallDirs)
install(TARGETS testCMakeGui
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

#如果主版本号等于6,则调用qt_finalize_executable函数来完成testCMakeGui可执行文件的最终配置。
if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(testCMakeGui)
endif()

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

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

相关文章

如何解决pycharm创建项目报错 Error occurred when installing package ‘requests‘. Details.

🐯 如何解决PyCharm创建项目时的包安装错误:‘requests’ 🛠️ 文章目录 🐯 如何解决PyCharm创建项目时的包安装错误:requests 🛠️摘要引言正文📘 **问题分析**🚀 **更换Python版本…

OpenCV 实现重新映射(53)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 实现霍夫圆变换(52) 下一篇 :OpenCV实现仿射变换(54) 目标 在本教程中,您将学习如何: 一个。使用 OpenCV 函数 cv::remap 实现简…

Java Web 开发 - 掌握拦截器和监听器

目录 深入了解Java Web的拦截器和监听器 拦截器(Interceptor) 拦截器的使用场景 拦截器实例 思维导图 ​编辑 监听器(Listener) 监听器的使用场景 监听器类型 监听器实例 思维导图​编辑 总结 深入了解Java Web的拦截器…

C——双向链表

一.链表的概念及结构 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢?意思就是链表在物理结构上不一定是连续的,但在逻辑结构上一定是连续的。链表是由一个一个的节点连…

uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件

前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…

java-函数式编程-函数对象

定义 什么是合格的函数?无论多少次执行函数,只要输入一样,输出就不会改变 对象方法的简写 其实在类中,我们很多参数中都有一个this,被隐藏传入了 函数也可以作为对象传递,lambda就是很好的例子 函数式接口中…

ROS实操:通信机制的实现

最近闲来无事,打算重温了一下ROS方面的相关知识。先前的学习都是一带而过,发现差不多都忘了,学习的不够深入。因此,在重温的同时,写下了这篇关于ROS架构的学习博客。 上一篇博客的链接为:ROS架构的学习【No…

如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响

原文链接:如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247602528&idx6&snc89e862270fe54239aa4f796af07fb71&chksmfa82…

visio画图基本用法

添加图形 点击上面的箭头 添加一些基本的形状 添加连接点 点击这个 X 按住Ctrl,在想要的位置上添加连接点 更改线条样式 选中线条之后,右键 可以选择箭头样式 添加文本框 visio对象复制到word里面,画布存在大量空白问题 https://blog.…

【C语言】深入了解文件:简明指南

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、文件的概念1.1 文件名:1.2 程序文件和数据文件 二、数据文…

如何利用MCU自动测量单元提高大坝安全监测效率

大坝作为重要的水利基础设施,其安全性直接关系到人民群众的生命财产安全和社会的稳定发展。因此,对大坝进行实时、准确的安全监测至关重要。近年来,随着微控制器单元(MCU)技术的不断发展,其在大坝安全监测领域的应用也越来越广泛。…

数据结构——排序算法分析与总结

一、插入排序 1、直接插入排序 核心思想:把后一个数插入到前面的有序区间,使得整体有序 思路:先取出数组中第一个值,然后再用tmp逐渐取出数组后面的值,与前面的值进行比较,假如我们进行的是升序排序&…

操作系统的运行机制详解

操作系统的 运行机制 #mermaid-svg-jVBbLUJa6gITOo7L {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jVBbLUJa6gITOo7L .error-icon{fill:#552222;}#mermaid-svg-jVBbLUJa6gITOo7L .error-text{fill:#552222;stroke…

C 深入指针(1)

目录 一、const 1、const修饰变量 2、const修饰指针 2.1 const int* p(int const* p) 2.2 int* const p 2.3 结论 二、指针运算 1、指针 - 整数 2、指针 - 指针 3、指针的关系运算 三、指针的使用 1、模拟实现 strlen 2、传值调用和传址调用…

安装VMware Tools报错处理(SP1)

一、添加共享文件 因为没有VMware Tools,所以补丁只能通过共享文件夹进行传输了。直接在虚拟机的浏览器下载的话,自带的IE浏览器太老了,网站打不开,共享文件夹会方便一点,大家也可以用自己的方法,能顺利上…

Kafka介绍、安装以及操作

Kafka消息中间件 1.Kafka介绍 1.1 What is Kafka? 官网: https://kafka.apache.org/超过 80% 的财富 100 强公司信任并使用 Kafka ;Apache Kafka 是一个开源分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成…

kubernetes中使用ELK进行日志收集

目录 一、需要收集哪些日志 1、kubernetes集群的系统组件日志 2、应用日志 二、日志收集方案ELK 1、收集日志:Logstash 2、存储日志:Elasticsearch 3、展示日志:Kibana 三、安装elk 1、下载安装包 2、创建用户并切换到新用户 3、上…

【Excel】excel连接数字和符号

使用“&”对数字和符号进行连接 示例: 将“2.6”和“,”连成“2.6,” 连接公式为: V3&W3 V3和W3分别是"2.6"和“,”在excel中的位置

数据结构的队列(c语言版)

一.队列的概念 1.队列的定义 队列是一种常见的数据结构,它遵循先进先出的原则。类似于现实生活中排队的场景,最先进入队列的元素首先被处理,而最后进入队列的元素则要等到前面的元素都被处理完后才能被处理。 在队列中,元素只能…

Text-to-SQL小白入门(12)Awesome-Text2SQL开源项目star破1000

项目介绍 项目地址 23年9月份刚开源这个项目,大半年过去了,star数终于破1000啦,决定在知乎更新一下内容,看看内容变化,知乎有上当时项目介绍的链接:追光者:Text-to-SQL小白入门(六&…