CMakeLists.txt 文件解析

CMake 3.28 实战:从单文件到多模块项目,5个CMakeLists.txt模板解析 本文详细解析了CMake 3.28在单文件到多模块项目中的5种CMakeLists.txt模板配置实践。从极简单文件项目到复杂多库依赖管理,涵盖跨平台编译和现代依赖管理方案,帮助开发者高效构建C++项目。特别推荐使用CMake 3.28新特性如`CONFIGURE_DEPENDS`和`$<PLATFORM_ID>`实现更优雅的工程配置。 阅读详情

使用 Qt Creator 创建 Qt 项目时,通常会自动生成一个 CMakeLists.txt 文件。它是 CMake 项目的配置文件,用于描述项目的基本信息、依赖库、源文件以及构建和安装方式。

下面对这份 CMakeLists.txt 进行逐行分析。

1. 指定 CMake 最低版本

cmake_minimum_required(VERSION 3.19)

cmake_minimum_required() 用于指定项目所要求的最低 CMake 版本。

这里的:

VERSION 3.19

表示该项目要求 CMake 版本不低于 3.19。

如果当前系统中的 CMake 版本低于这个要求,CMake 在配置项目时会给出相应提示或错误。


2. 定义项目

project(RadarSimulation LANGUAGES CXX)

project() 用于定义一个 CMake 项目。

其中:

RadarSimulation

表示项目名称。

LANGUAGES CXX

表示该项目使用 C++。

CMake 中常见的语言标识包括:

C       C语言
CXX     C++
ASM     汇编

因此:

project(RadarSimulation LANGUAGES CXX)

可以理解为:

创建一个名为 RadarSimulation、使用 C++ 语言的 CMake 项目。


3. 查找 Qt6

find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets)

find_package() 用于查找项目所依赖的软件包或库。

这里表示查找 Qt6。

其中:

Qt6

表示需要 Qt6。

6.5

表示要求 Qt 版本至少为 6.5。

REQUIRED

表示 Qt 是项目运行所必需的依赖。如果找不到满足要求的 Qt,CMake 配置过程将无法正常继续。

COMPONENTS Core Widgets

表示除了 Qt6 本身之外,还需要 Qt6 的两个组件:

  • Core
  • Widgets

所以这一整行可以理解为:

查找版本不低于 6.5 的 Qt6,并且要求其中的 Core 和 Widgets 模块可用。


4. Qt 标准项目配置

qt_standard_project_setup()

这是 Qt 提供的 CMake 函数,用于对 Qt 项目进行标准化配置。

它可以帮助项目设置 Qt 推荐的构建方式,并处理一些 Qt 项目常见的自动化配置。

使用 Qt6 和 CMake 创建项目时,这通常是 Qt Creator 自动生成的标准配置。

一般情况下不需要修改这一行。


5. 创建可执行程序

qt_add_executable(RadarSimulation
    WIN32 MACOSX_BUNDLE
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
)

qt_add_executable() 用于创建一个可执行程序目标。

这里:

RadarSimulation

是生成的可执行程序目标名称。

后面的文件:

main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui

表示这些文件属于这个可执行程序。

也就是说,CMake 会根据这些源文件和配置,最终构建出一个名为 RadarSimulation 的可执行程序。


6. WIN32

WIN32

WIN32 是 CMake 提供的一个选项。

在 Windows 平台上,它表示将该目标作为 Windows GUI 应用程序处理,而不是控制台程序。

例如普通的 Windows 图形界面程序通常不希望启动时出现一个额外的控制台窗口,这个选项就是相关配置之一。

需要注意的是:

WIN32 并不表示这个程序只能在 Windows 上运行。

它只是针对 Windows 平台生效。


7. MACOSX_BUNDLE

MACOSX_BUNDLE

这个选项用于 macOS 平台。

它表示将生成的 macOS 应用程序作为 Bundle 进行处理。

macOS 中常见的:

xxx.app

就是一种应用程序 Bundle。

因此:

WIN32 MACOSX_BUNDLE

主要是在告诉 CMake:

Windows 和 macOS 平台下,都按照相应的图形界面应用程序形式处理这个可执行程序。


8. 源文件

main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui

这些是 Qt Creator 创建项目时常见的几个文件。

其中:

main.cpp

通常是 C++ 程序入口。

mainwindow.cpp

通常存放窗口类的实现代码。

mainwindow.h

通常存放窗口类的声明。

mainwindow.ui

是 Qt Designer 使用的 UI 文件,用于描述图形界面的布局和控件。

CMake 将这些文件作为可执行程序目标的一部分进行构建。


9. 链接库

target_link_libraries(RadarSimulation
    PRIVATE
        Qt::Core
        Qt::Widgets
)

target_link_libraries() 用于指定目标程序需要链接的库。

这里的目标是:

RadarSimulation

需要使用:

Qt::Core
Qt::Widgets

两个 Qt 模块。

也就是说:

RadarSimulation
       │
       ├── Qt::Core
       │
       └── Qt::Widgets

这样在程序中使用 Qt 提供的相关类和功能时,链接器才能正确完成最终的程序构建。


10. PRIVATE 是什么意思?

这里有:

PRIVATE

CMake 中的库依赖通常可以使用:

PRIVATE
PUBLIC
INTERFACE

进行描述。

简单理解:

PRIVATE

表示这个依赖只属于当前目标内部使用。

PUBLIC

表示当前目标需要使用,同时依赖当前目标的其他目标也需要这个依赖。

INTERFACE

表示当前目标本身不需要,但依赖当前目标的其他目标需要。

对于一个普通的 Qt 应用程序:

target_link_libraries(RadarSimulation
    PRIVATE
        Qt::Core
        Qt::Widgets
)

使用 PRIVATE 是非常常见的写法。


11. install() 安装配置

install(TARGETS RadarSimulation
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

install() 用于指定项目执行安装操作时,各类文件应该被安装到什么位置。

这里:

TARGETS RadarSimulation

表示对 RadarSimulation 这个目标进行安装配置。


12. DESTINATION

例如:

RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}

表示运行时文件应该安装到指定的 bin 目录。

而:

LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}

表示库文件安装到指定的 lib 目录。

BUNDLE DESTINATION .

则主要针对 macOS Bundle。

这里使用的:

${CMAKE_INSTALL_BINDIR}
${CMAKE_INSTALL_LIBDIR}

是 CMake 中的变量,用于表示相应的安装目录。


13. 生成 Qt 部署脚本

qt_generate_deploy_app_script(
    TARGET RadarSimulation
    OUTPUT_SCRIPT deploy_script
    NO_UNSUPPORTED_PLATFORM_ERROR
)

这是 Qt6 提供的部署相关功能。

它用于生成一个应用程序部署脚本。

其中:

TARGET RadarSimulation

表示针对 RadarSimulation 这个目标生成部署配置。

OUTPUT_SCRIPT deploy_script

表示生成的部署脚本名称保存到:

deploy_script

这个 CMake 变量中。

NO_UNSUPPORTED_PLATFORM_ERROR

表示在某些不支持该部署方式的平台上,不直接因为该原因产生错误。


14. 执行部署脚本

最后:

install(SCRIPT ${deploy_script})

表示在安装阶段执行前面生成的部署脚本。

前面的代码:

qt_generate_deploy_app_script(
    TARGET RadarSimulation
    OUTPUT_SCRIPT deploy_script
)

负责生成脚本。

这里:

install(SCRIPT ${deploy_script})

负责在安装过程中执行这个脚本。

两者结合起来,就形成了:

生成部署脚本
      ↓
保存到 deploy_script
      ↓
install()
      ↓
安装时执行部署脚本

15. 整个 CMakeLists.txt 的结构

1. 指定 CMake 最低版本

2. 定义项目

3. 查找 Qt6

4. Qt 标准项目配置

5. 创建可执行程序

6. WIN32

7. MACOSX_BUNDLE

8. 源文件

9. 链接库

10. PRIVATE 是什么意思?

11. install() 安装配置

12. DESTINATION

13. 生成 Qt 部署脚本

14. 执行部署脚本


把整个文件串起来,可以得到一个比较清晰的结构:

CMakeLists.txt
│
├── cmake_minimum_required()
│      ↓
│   指定最低 CMake 版本
│
├── project()
│      ↓
│   定义项目名称和语言
│
├── find_package()
│      ↓
│   查找 Qt 依赖
│
├── qt_standard_project_setup()
│      ↓
│   设置 Qt 项目的标准配置
│
├── qt_add_executable()
│      ↓
│   创建可执行程序并指定源文件
│
├── target_link_libraries()
│      ↓
│   链接所需要的 Qt 库
│
├── install()
│      ↓
│   设置安装规则
│
├── qt_generate_deploy_app_script()
│      ↓
│   生成 Qt 部署脚本
│
└── install(SCRIPT ...)
       ↓
    执行部署脚本

因此,这份 CMakeLists.txt 本质上是在回答几个问题:

这个项目叫什么?

project(...)

需要什么环境和依赖?

find_package(...)

需要编译哪些文件?

qt_add_executable(...)

需要链接哪些库?

target_link_libraries(...)

安装和部署时应该怎么处理?

install(...)
qt_generate_deploy_app_script(...)

对于刚接触 Qt 和 CMake 的开发者来说,首先理解这几个核心部分,就已经能够读懂大多数 Qt Creator 自动生成的基础 CMakeLists.txt。

DuckDB:详细解析CMakeLists.txt CMake(Cross-Platform Make)是一种跨平台的构建系统生成器,用于管理和自动化软件的构建过程。它通过编写配置文件(通常是 CMakeLists.txt)来定义项目的构建规则,支持多种编译器和操作系统,能够生成本地化的构建文件(如 Makefile、Visual Studio 解决方案等)。跨平台项目:需要在多种操作系统上构建和部署的项目。大型项目:包含多个模块和依赖的复杂项目。团队开发:需要统一构建流程和配置的团队开发环境。 阅读详情

相关推荐

PX4 CMakeLists.txt分析

简单的概述 make 和 cmake 是linux/UNIX系统下广泛使用的构建编译规则工具,面对复杂庞大的工程,各种源文件和工具文件分布在工程目录下,如何组织和有序地编译和使用这些文件,显然也是一项复杂的任务。Makefile是直接地定义编译规则以及描述目标之间依赖关系。CMakeLists.txt虽然也是具有相同的功能,但是它是对Makefile的抽象化以便更容易地实现工程编译规则的编写。(

W. Charley 3639

别再只source setup.bash了!ROS2项目打包与安装的完整流程解析:从CMakeLists.txt到可执行文件

本文深入解析ROS2项目从CMakeLists.txt配置到可执行文件生成的完整流程,解决常见的'no executable found'报错问题。通过详细讲解colcon、ament和CMake的协作机制,以及install命令的正确使用,帮助开发者实现ROS2项目的工程化部署与系统集成。

weixin_30587927的博客 476

SOEM主站开发篇(5):CMakeLists.txt文件解析

详细介绍了SOEM主站的CMakeLists.txt文件,为后面的SOEM主站开发铺路。

kevin1499的博客 1601

cmakelists.txt文件解析

文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。 任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处。 用于柳絮项目的CMakeLists.txt文件是标准的香草CMakeLists.txt文件,带有一些其他约束。 您的CMakeLists.txt文件必须遵循此格式,否则您的软件包将无法正确构建。 配置中的顺序不计算在内。 Required CMake Version (cmake_minimum_requi

ahelloyou的博客 1800

什么是无人机巡检?如何实现无人机自动巡检?

复亚智能的无人机自动巡检系统通过高度自动化的技术,实现了无人机的高效巡检作业。无人机自动机场支持无人机的自动起降和电池更换,自动飞行算法确保无人机在复杂环境中的精准飞行和拍摄,而云端识别诊断和AI感知算法平台则实现图像的实时传输和智能分析。复亚智能,作为无人机技术的创新者和推动者,致力于开发先进的无人机自动巡检解决方案,助力各行各业实现智能化、自动化的巡检工作,引领智能巡检的未来。利用人工智能和机器学习算法,无人机可以被训练来识别特定的模式和异常,如结构损坏、热泄漏等,从而提高巡检的准确性和效率。

foiadrone的博客 2844

保姆级教程:在Windows 11上用VSCode和Conda搞定Depth-Anything-3(含常见报错修复)

本文提供在Windows 11系统上使用VSCode和Conda配置Depth-Anything-3的完整教程,涵盖环境搭建、依赖安装、常见报错修复及深度图生成实战。特别针对CUDA与PyTorch版本匹配、Hugging Face镜像加速等关键问题提供解决方案,帮助开发者高效实现计算机视觉中的深度估计应用。

weixin_30338481的博客 347

Clion文件夹有很多CMakeLists.txt如何只解析一个?

Clion文件夹有很多CMakeLists.txt如何只解析一个? 在CLion中,当您打开包含多个

Kp0fS的草稿纸 937

运行stable-diffusion出现的问题

解决:即用 https://github.com/CompVis/taming-transformers/blob/master/taming/modules/vqvae/quantize.py 新文件,替换错误提示文件中的全部内容即可。5.新建文件夹 CompVis/stable-diffusion-safety-checker/将下载的四个文件放入 解决!后面还会遇到'openai/clip-vit-large-patch14离线下载的问题,同样步骤解决。解决:下载后离线,步骤如下。

weixin_52121118的博客 2348

ROS下CMakeLists.txt文件解析

从gcc到make再到cmake以及catkin解析参考make和cmake简要介绍_make cmake-优快云博客catkin是ROS官方自定义的编译系统,它的原理与流程与Cmake很相似,和老版本rosbuild相比,支持更好的可移植性(catkin结合了可移植性好的CMake和python)以及交叉编译。(在ROS2使用的编译工具是ament,它是由catkin优化迭代而来的版本)。知乎 - 安全中心。

gaoziqunde的博客 1155

铝合金外壳表面处理工艺全解析:从阳极氧化到瓷泳喷涂的7种方法对比

本文全面解析了铝合金外壳的7种主流表面处理工艺,包括阳极氧化、粉末喷涂、瓷泳喷涂等。通过对比其原理、性能、成本与应用场景,为产品设计师和工程师提供了从防护性、装饰性到功能性的立体选型框架,帮助您根据具体需求选择最佳工艺方案。

weixin_29278805的博客 745

车辆横向控制MPC实战:从‘老王模型’到CasADi求解的保姆级避坑指南

本文详细解析了车辆横向控制MPC的实战应用,从经典动力学模型选择到CasADi求解器的优化配置,提供了一套完整的避坑指南。重点介绍了车辆动力学模型的验证要点、CasADi环境的高效配置技巧以及MPC问题建模的核心要素,帮助开发者快速实现稳健的横向控制方案。

weixin_42524499的博客 346

【ROS】CMakeLists.txt文件解析

这就是CMakeLists.txt文件的大部分主要功能的解析,其中还有一个generate_dynamic_reconfigure_options()函数没有说到,这个是根动态参数配置相关的,将会在介绍dynamic reconfigure的文章中说到。

qq_52785580的博客 2185

65页PPT全面学习大型汽车集团企业IT信息化(管理架构、应用架构、技术架构)

订单到交付(OTD):借助ERP、MES、LES、SRM、QMS、APS等系统,实现财务与业务一体化、高级排产、生产过程自动化及供应链协同。- 数据标准化:数据标准化是企业信息化建设基石,包括制定统一业务解释和标准、维护管理流程、发布应用等,涉及数据统一定义、分类、编码等内容。- 大数据应用:汽车行业大数据应用涵盖生产、销售、售后等环节,如设备预见性保养、销量预测、质量预警等,提升企业运营效率和决策能力。- 策略明晰:明确C2M管理矩阵,包括供应商、采购、物流、制造、销售、财务等环节的策略。

cdfunlove的博客 1049

CMakeLists.txt文件解析

CMakeLists.txt: PROJECT(OpenCV_Example) //这是建立一个工程项目(类似于我们VS中建立C++项目一样),括号里面时工程名,工程名我们可以任意给,最后程序编译出来的可执行文件就是这个名字 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)    //这是对CMake工具最低版本要求,这里我们要检查下我们的CMake工具...

share space的博客 794

基于Simulink的新能源汽车热管理系统设计与仿真详细介绍

新能源汽车(如纯电动汽车和混合动力汽车)的热管理系统是确保电池、电机和电控系统高效运行的关键。通过合理设计热管理系统,可以提高车辆的续航里程、延长电池寿命并提升整体性能。以下是如何在 MATLAB 和 Simulink 中设计并仿真一个新能源汽车热管理系统的详细步骤。通过上述步骤,我们成功设计并实现了基于 Simulink 的新能源汽车热管理系统。该系统能够根据目标温度和实际反馈,通过 PID 控制器或模糊控制器调整冷却液流量、风扇转速等参数,实现对电池、电机和车内的精确温度控制。

xiaoheshang_123的博客 385

等保测评-达梦数据库

一般适用于等保测评

m0_54146694的博客 1297

【Qt】【CMake】-CMakeLists.txt-编译错误:源文件路径配置全解析

本文深入解析Qt项目中使用CMake时常见的编译错误,特别是CMakeLists.txt中的源文件路径配置问题。从基础路径变量解释到实战配置技巧,详细介绍了如何避免'No SOURCES given to target'等错误,并提供了Qt项目特有的资源文件处理方法和跨平台路径处理的最佳实践。

s3t4u的博客 822

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

sylar高性能服务器框架:CMakeLists.txt文件解析

force_redefine_file_macro_for_sources(targetname) 这个 CMake 函数的主要目的是 重定义源文件中的 _ _ FILE _ _ 宏,使其包含相对于项目根目录的文件路径,而不是默认的绝对路径。是 CMake 中用来创建一个共享库(Shared Library)的命令,具体来说,它创建了一个名为 sylar 的共享库,并将源文件列表 LIB_SRC 中列出的文件编译成这个库。:是之前定义的 CMake 变量,代表最终需要编译成库的源文件列表。

fcopy的博客 893

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Qt内CMake文件解析(CMakeLists.txt)

【代码】Qt内CMake文件解析(CMakeLists.txt)

不定期更新,欢迎查阅 1091

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

CMakeLists.txt多文件编译与大数组链接问题解析

CMake是跨平台构建系统生成器,而非编译脚本——其核心在于声明项目结构而非编写执行流程。理解add_executable和target_link_libraries的声明式逻辑,是解决多cpp文件未参与链接、符号未定义等常见错误的前提;而大数组导致的‘静默崩溃’,本质是栈空间不足触发的链接器失败,需通过std::vector堆分配或全局变量迁移来规避。这些属于C++工程化构建的基础能力,广泛应用于CLion、VS Code等IDE的CMake项目配置,尤其在嵌入式图像处理、算法Demo等教学与原型开发场景

weixin_28831461的博客 265

PX4 CMakeLists.txt 文件剖析

PX4 CMakeLists.txt 文件剖析 前面对于 PX4 的 Makefile 已经做了比较详细的分析, 这里进一步对 PX4 的 CMakeLists.txt 文件结构进行进一步的分析. 1 CMake 简述 CMake 是一个DSL( Domain Specific Language), 主要用来辅助对代码的编译配置和管理, 其具有跨平台, 可维护性较好的特点, 目前在 C++ 项目中...

lipi37的博客 2539

ROS中CMakeLists.txt文件详解

这篇文章是有关ROS中catkin CMakeLists.txt使用的内容。 CMakeList.txt文件是CMake编译系统编译软件包过程的输入文件。任何CMake兼容包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何编译代码以及将其安装到哪里。将CMakeLists.txt文件应用于一个catkin项目时,它就作为一个标准的附带一些限制条件的vanilla CMakeLists.txt文件。使用CMake编译程序时,cmake指令依据CMakeLists.txt 文件生成makef

weixin_43956732的博客 3818

详细解释一个ros的CMakeLists.txt文件

【代码】详细解释一个CMakeLists.txt文件。

Tipriest的博客 342

android CMakeLists.txt文件详解

很多时候时候我们不得不感叹工具的强大是我们的生活和和工作变的越来越简单。在android 的ndk 开发中我们历经了有命令编译到eclipse 在studio 的工具的变迁,这一切都是朝着开发流程越来越简单,开发效率越来越高的方向发展。 今天学习了如何在Studio 使用CMakeLists.txt配置文件进行NDK 开发,感觉流程简单了很多,今天想详细介绍换一下CMakeLists.txt的使...

宋大人专栏 5288

ROS中通过CmakeLists.txt文件自动生成protobuf的源文件

这里写自定义目录标题1 目录结构2 CmakeLists 1 目录结构 目录结构如下图所示,其中: mocius是工作空间workspace名称; proto是rospackage的名称; pb是rospackage包中用于存放*.proto文件的文件夹,可以看到pb中包含两个文件夹common和sample,两个文件夹下面分别存放着*.proto文件. 三个*.proto文件的内容如下: //...

小兵大将0221 3107

ROS中CMakeLists.txt文件 使用 讲解与总结

ROS中CMakeLists.txt文件 使用 讲解与总结CMakeLists.txt作用CMakeLists.txt写法CMakeLists实例 CMakeLists.txt作用 在ROS系统的功能包中 要包含 CMakeLists.txt 与 package.xml 文件 来 编译功能包的内容 CMakeLists.txt原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了...

月照银海似蛟龙的博客 4557
上一篇: C++ Qt6 雷达模拟器实战:从 TCP 通信到 PPI 雷达界面的完整项目
下一篇: C++ Qt项目如何上传到GitHub:以RadarSimulator为例,从Git初始化到Push完整实战
Junfeng_Li
博客等级 码龄10年 7粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Junfeng_Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值