Qt6项目CMakeLists.txt详解

  • cmake_minimum_required(VERSION 3.21.1):设置cmake需要的最低版本。

  • option(<option_variable> "<option_description>" <initial_value>):用于定义一个用户可配置的选项,其中<option_variable>定义一个CMake变量,用于存储该选项的状态,<option_description>是选项的描述信息,<initial_value>是选项的初始值,一般为ON或者OFF

    说白了就是定义一个变量,在CMakeLists.txt中使用。比如QML默认的2个配置:

    vbnet 复制代码
    option(LINK_INSIGHT "Link Qt Insight Tracker library" ON)
    option(BUILD_QDS_COMPONENTS "Build design studio components" ON)

    第一个是是否需要链接Qt Insight Tracker库,该库是一个应用程序和嵌入式设备的智能分析工具,然后该变量的后面的使用是:

    scss 复制代码
    if (LINK_INSIGHT)
        include(${CMAKE_CURRENT_SOURCE_DIR}/insight)
    endif ()

    第二个是是否构建Qt Design Studio的组件,该工具可以为设计师和开发人员快速构建UI的工具,后面的使用是:

    scss 复制代码
    if (BUILD_QDS_COMPONENTS)
        include(${CMAKE_CURRENT_SOURCE_DIR}/qmlcomponents)
    endif()

    合理使用option进行合理化的构建,可以节省构建资源,加快速度。

  • project(HelloQMLApp LANGUAGES CXX):设置项目名称、编程语言等,如果不设置编程语言,CMake会根据项目中的文件类型自动推断出所使用的编程语言。

  • set(CMAKE_AUTOMOC ON):告诉CMake在构建过程中自动运行moc(Meta-Object Compiler)工具来处理包含了Q_OBJECT宏的C++源文件。当C++类中包含有Q_OBJECT宏时,这意味着该类涉及了信号槽机制,需要通过moc工具生成额外代码。

  • find_package()是CMake中用于查找并且加载外部软件包的一个命令,通常用于引入和管理项目所需的第三方库或者模块。

    基本语法是:

    css 复制代码
    find_package(<package_name> [version] [EXACT] [QUIET] [MODULE] [REQUIRED]
                 [COMPONENTS [components...]]
                 [OPTIONAL_COMPONENTS components...]
                 [NO_POLICY_SCOPE])
    ​

    其中参数说明:

    • <package_name>:要查找的软件包的名称;
    • [version]:可选项,指定软件包的版本号;
    • [EXACT]:可选项,要求精确匹配指定版本的软件包;
    • [QUIT]:可选项,安静模式,不输出查找过程的详细信息;
    • [REQUIRED]:可选项,要求必须找到指定的软件包,否则会引发错误;
    • [COMPONENTS] [components ...]:指定要查找的软件包的组件。

在QML项目中,默认有find_package(Qt6 6.2 REQUIRED COMPONENTS Core Gui Qml Quick)表示需要加载Qt6.2,并且要求CoreGui等几个组件。

  • qt_add_executable(HelloQMLApp src/main.cpp):该指令和add_executable不同,它是Qt6中用于添加一个可执行文件的函数调用。该语句的作用是将名为HelloQMLApp的可执行文件与指定的源文件src/main.cpp相关联。功能包括如下几点:

    • 创建可执行文件,在项目中创建一个名为HelloQMLApp的可执行文件。
    • 指定源文件,源文件src/main.cpp就是入口源文件。
    • 与Qt相关联,由于是使用Qt6构建项目,qt_add_executable()函数会自动处理与Qt相关的配置,例如生成moc文件,以确保Qt功能正常使用。
    • 简化配置,有助于简化项目的配置过程,特别是涉及到Qt功能的部分。
  • qt_add_resources的作用是将二进制资源编译为源代码,这个比较有意思,该指令的使用是:

    css 复制代码
    qt_add_resources(<TARGET> <RESOURCE_NAME>
                      [PREFIX <PATH>]
                      [LANG <LANGUAGE>]
                      [BASE <PATH>]
                      [BIG_RESOURCES]
                      [OUTPUT_TARGETS <VARIABLE_NAME>]
                      [FILES ...] [OPTIONS ...])
    ​

    其中<TARGET>是目标,即往哪个程序或者库中添加资源;<Resource_Name>是资源名,自定义;PREFIX PATH是可选的,指定路径资源,即访问该资源需要的前缀,默认是/FILES是可选的,指需要添加的二进制资源文件。

    比如代码:

    bash 复制代码
    qt_add_resources(${PROJECT_NAME} "txt"
        PREFIX
            "txt"
        FILES
            in.txt
    )

    如果要访问in.txt,则需要file.setFileName(":txt/in.txt");

    同理,在默认项目中有如下代码:

    erlang 复制代码
    qt_add_resources(HelloQMLApp "configuration"
        PREFIX "/"
        FILES
        qtquickcontrols2.conf
    )

    即把qtquickcontrols2.conf当作资源文件,添加进项目中。

  • target_link_libraries的作用是用于配置链接,比如在项目中有代码:

    less 复制代码
    target_link_libraries(HelloQMLApp PRIVATE
        Qt6::Core
        Qt6::Gui
        Qt6::Qml
        Qt6::Quick
    )

    Qt6模块链接到名为HelloQMLApp上,以便在构建目标文件时可以使用这些模块提供的功能和库。同时,使用私有链接,意味着只有HelloQMLApp可以访问这些链接的内容,其他目标无法直接访问。

  • include命令用于包含外部文件或者脚本文件到当前CMakeLists.txt文件中,包括其他的CMakeLists.txt、模块文件、函数文件、宏文件等,以便在当前的构建过程中使用他们。

    include(GNUInstallDirs)用于包含GNU安装目录相关的定义和变量,主要是获取一些GNU安装目录相关的变量在后面可以使用,比如${CMAKE_INSTALL_LIBDIR}

  • install命令用于配置安装规则,指定在构建完成后,如何将生成的文件安装到指定的位置。安装规则通常用于将构建生成的文件(如可执行文件、库文件、头文件等)安装到系统的特定目录,以便用户可以访问这些文件。

    比如在项目中:

    bash 复制代码
    install(TARGETS HelloQMLApp
        BUNDLE DESTINATION .
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    )

    作用就是用于安装HelloQMLApp的目标文件到不同的目录中,具体来说就是将目标文件安装为一个包(bundle)时,将其安装到当前构建目录下。当将HelloQMLApp安装为一个库文件时,将其安装到${CMAKE_INSTALL_LIBDIR}目录中。当将HelloQMLApp安装为一个运行时文件时,安装到${CMAKE_INSTALL_BINDIR}目录中。

  • set命令用于设置变量的值,可以用于创建新变量、更新已存在的变量或者删除变量。基本语法是:

    xml 复制代码
    set(<variable> <value> [CACHE <type> <docstring> [FORCE]])

    各个选项的作用:

    • variable表示要设置的变量名,可以是已存在的变量,也可以是一个新的变量。
    • value是要设置的变量,可以是简单的字符串或列表,也可以是一个表达式或者函数调用。
    • CACHE <type> <docstring>将变量设置为一个缓存变量,以便用户可以通过命令行或者配置工具将其修改。type是变量类型,docstring为对变量的描述。

    比如在项目中有:

    bash 复制代码
    set(QML_IMPORT_PATH ${PROJECT_BINARY_DIR}/qml CACHE PATH
        "Path to the custom QML components defined by the project")

    作用就是定义QML组件的导入路径,其中PATH表示这个缓存变量是路径。

相关推荐
VT.馒头2 分钟前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript
数研小生31 分钟前
Full Analysis of Taobao Item Detail API taobao.item.get
java·服务器·前端
Shirley~~41 分钟前
Vue-skills的中文文档
前端·人工智能
毎天要喝八杯水1 小时前
搭建vue前端后端环境
前端·javascript·vue.js
计算机程序设计小李同学1 小时前
幼儿园信息管理系统的设计与实现
前端·bootstrap·html·毕业设计
雨季6662 小时前
Flutter 三端应用实战:OpenHarmony “专注时光盒”——在碎片洪流中守护心流的数字容器
开发语言·前端·安全·flutter·交互
tao3556672 小时前
【用AI学前端】HTML-02-HTML 常用标签(基础)
前端·html
2601_949532842 小时前
Psello HTML Template: A Developer‘s Deep-Dive Review and Guide - Download Free
前端·windows·html·seo·wordpress·gpl
CappuccinoRose2 小时前
CSS前端布局总指南
前端·css·学习·布局·flex布局·grid布局·float布局
穿过锁扣的风2 小时前
如何操作HTML网页
前端·javascript·html