开发Qt程序时,为什么是CMake?

开发Qt程序时,为什么是CMake?

什么是CMake?

CMake 是一个跨平台的构建工具,用来管理 C/C++ 项目的编译过程。它通过读取 CMakeLists.txt 配置文件,自动生成适合不同操作系统和编译器的构建脚本(比如 Makefile 或 Visual Studio 项目),让开发者只需写一次配置,就能在各种环境下编译代码。简单说,CMake 帮你省去了手动写复杂编译命令的麻烦。

QMake(由.pro文件组织起来的编译结构)和CMake(由CMakeLists.txt组织起来的编译结构)实际上都是类似的,都是由一个脚本组织整个编译过程,而且都是使用自己的方式简化了整个编译过程。

为什么是CMake?

我只说三个原因:

一、Qt Group事实上已经放弃了QMake作为官方的编译工具,仅保留维护更新

二、CMake是大部分C++库编译脚本的事实标准

三、VS对QMake的支持几乎为零,Qt + VS的Qt插件支持,但是这个插件也几乎停止更新了。CMake有VS的支持。

我可以列出一大堆CMake比QMake更优越的理由,但是工程中使用CMake只需要上面三个理由就好了。

如何编译CMake的项目

一般情况下,需要在项目文件夹最顶层找到一个CMakeLists.txt,这个编译脚本通常是最顶层的脚本,控制整个编译链。

一个项目里通常由很多个CMakeLists.txt组成的,通常情况是由最上层的一个CMakeLists.txt作为父项目,通过类似add_subdirectory等方法,控制其余多个子项目的编译。

可以使用命令cmake … 等方式编译,我这里展示使用CMake Gui Tool 编译
请添加图片描述

一般情况,你在上面Where is the source code :中找到一个带有CMakeLists.txt的路径,然后在Where to build the binaries中,把上面的路径copy下来,然后在后面加上一个build文件夹就好了,这样这个项目的所有内容都会编译到这个build文件夹里面来。

如果是第一次编译,可能会弹窗,比如

请添加图片描述

这里提示是build文件夹不存在是否创建一个,这里点yes创建。

请添加图片描述

这里第一行是向你询问使用什么生成工具,换句话说就是你想使用哪个IDE对项目进行编译和管理,这里
支持的IDE还挺多的,但是我这里选择使用Visual Studio 2022 编译,谁会拒绝宇宙第一IDE呢?

第二行问的是目标框架,我们由于是在Windows上开发,所以不用选,默认是x64,如果需要交叉编译一些特殊架构的,那你会知道你为什么要选这个,这里我们不选。

第三行问的是有没有一些特殊的参数,不知道的话就是没有

下面四个按钮如果你不知道什么意思就也不用选。

这里点Finish 就可以了。

请添加图片描述

点击Finish之后,就开始配置CMake项目了,如果参数检查一切正确,那么就会出现Configuring done(xx s)的字样,爆红可能是一些warning而不是error,如果出现Configuring失败,则需要检查具体的error,具体问题具体分析。

比较常见的问题是由于环境变量的问题,上方的变量并没有正确配置,你可以选择手动在CMake Gui Tool 里面手动配置,也可以选择在环境变量里面配置。

这里Configuring Done之后,就可以点Generate了,一般Configure成功Generate不会失败,Generate Done之后,就可以在build文件夹里找到对应的项目管理文件sln了。双击打开,进入VS的CMake项目中。

如何在VS中管理CMake项目

生成sln 之后,点开你可能会看到一个ALL_BUILD和一个ZERO_CHECK,这两个项目不用管,相当于是VS为了自己管理CMake而添加的两个默认项目。

  1. 如果你编译ALL_BUILD,那么他会自己去编译所有项目

  2. ZERO_CHECK的功能是用于​​监控 CMake 配置文件的变更​​并自动重新生成构建系统。

请添加图片描述

你每个项目内,控制其项目文件的唯一途径是修改CMakeLists.txt,所以请不要像正常使用VS那样将头文件和CPP文件拖动进来。而是先修改CMakeLists.txt,然后再右键它,菜单栏找到编译,VS会自动帮你生成一个新的项目覆盖到原来的,并且会提示你文件已被覆盖是否重新进入项目。

常见问题

使用CMake 编译Qt的常见问题主要有两个

1. Qt的系统变量配置有问题

CMake编译 Qt需要一个这样的环境变量:

test

需要落位到Qt/版本号/编译器类型/lib/cmake/Qt6 文件夹下

2. Qt的某个库的路径找不到,CMake的Configure失败

Test

这里的一些路径可能会出现 NOT-FOUND的情况,暂时不知道是为什么,如果找不到路径,你需要做两件事:

  1. 你在其他成功的找到路径的DIR复制下来,把下面名字改一下,假设是这个Qt6LinguistTools_DIR的路径找不到了,你从上面复制一个D:/Devtools/Qt/6.8.0/msvc2022_64/lib/cmake/Qt6Gui下来,把这个Qt6Gui改成Qt6LinguistTools试试先。

  2. 如果再次Configure仍然NOT-FOUND,需要确认这个工具是否存在,比如这里有一些和QMultiMedia有关的依赖,但是你的Qt并没有安装QMultiMedia的组件,这个可能会导致这个问题。

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

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

相关文章

web布局10

Grid 布局指的是 CSS Grid Layout ,它和以往 CSS 框架(CSS Framework)中所说的网格系统(Grid System)有所不同。至今为止,它是唯一一个具有二维能力的布局系统,即,它是一个基于二维网…

Spring AI 项目实战(十二):Spring Boot +AI + DeepSeek + 百度OCR 公司发票智能处理系统的技术实践(附完整源码)

系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4

【FR801xH】Ubuntu24.04搭建富芮坤FR801xH系列开发环境教程

00. 目录 文章目录 00. 目录01. FR801xH概述02. FR801xH特性03. gcc-arm-none-eabi-10.3-2021.10概述04. gcc-arm-none-eabi-10.3-2021.10下载05. gcc-arm-none-eabi-10.3-2021.10安装06. FR801xH-SDK编译07. 附录 01. FR801xH概述 FR801xH 系列芯片是面向 SOC(片上…

Excel学习05

员工排班表 通过之前的学习,目前的我们已经具备了Excel的初步制作能力。接下来将从实际出发制作一个员工排班表。在制作排版表之前,先来看我们要用到的函数。 DATE函数 date函数是Excel中处理日期的核心函数之一,它能够将单独的年、月、日…

黑马JVM解析笔记(五):深入理解Java字节码执行机制

1.从字节码的角度分析i /** * 从字节码角度分析 a 相关题目 */ public class Demo3_2 {public static void main(String[] args) {int a 10;int b a a a--;System.out.println(a);System.out.println(b);} }a 和 a 实际上代表了两个不同的操作,它们分别对应自增…

从社交媒体到金融“超级应用”,马斯克X平台将上线投资交易服务

报道称,马斯克旗下的X平台将推出“超级App”,提供投资和交易服务,另外,X也在探索引入信用卡或借记卡。作为金融服务布局的第一步,X平台已宣布将推出X Money——一项数字钱包和点对点支付服务,Visa将成为其首…

【入门第2课】Splunk数据接入

前言 Splunk支持多种多样的数据源,比如它可以直接上传文件,可以监控本地的任何目录或文件,也可以配置通用转发器等方式来完成数据接入。Splunk所有的设置都可以通过Web页面、使用Splunk CLI命令,甚至是直接修改配置文件,以此来完成设置。 那么,如何接入数据呢?我们通过…

【数据挖掘】关联规则算法学习—Apriori

关联规则算法学习—Apriori Apriori算法是关联规则挖掘中的经典算法,用于发现数据集中的频繁项集和强关联规则。其核心思想基于先验性质:若一个项集是频繁的,则其所有子集也一定是频繁的。该算法通过逐层搜索的迭代方法高效挖掘关联规则。 要…

助力高考,利用python获取本专科专业选考科目要求

大家好,今天我们来利用python技术助力高考,获取网上的本专科专业选考科目要求,用到的Python模块有:Requests、Json、BeautifulSoup、Pandas ,主要思路是Requests获取接口请求,利用BeautifulSoup 解析网站的…

Python 商务数据分析—— NumPy 学习笔记Ⅱ

一、 数组元素值的替换 我们可以使用索引或 where () 函数来替换 NumPy 数组中的元素值。 1.1 方式一:索引 import numpy as npnp.random.seed(42)a3 np.random.randint(0, 10, size(3, 4))print("原数组:\n", a3)a3\[1] 0 # 将a3数组第一行数据全…

遥感图像语义分割1-安装mmsegmentation

参考: mmsegmentation: 安装并使用自定义数据集进行训练_mmsegmentation安装-CSDN博客 最新Windows配置安装mmcv与mmsegmentation,以及mmsegmentation的验证_mmcv安装-CSDN博客 GitCode - 全球开发者的开源社区,开源代码托管平台 参考: …

【菜狗的记录】模糊聚类最大树、图神经网络、大模型量化——20250627

每日学习过程中记录的笔记,从各个网站整理下来,用于当日复盘。 如果其中的知识点能帮到你,也很荣幸呀。 -------------------------------------------------------20250622------------------------------------------------------------- …

《短剧平台开发指南:技术方案、核心功能与行业趋势》

一、短剧行业现状与系统开发价值 近年来,短剧市场呈现爆发式增长,成为数字内容领域的新风口。数据显示,2023年国内短剧市场规模已突破300亿元,用户规模达到4.5亿。这种以"短、平、快"为特点的内容形式,凭借…

[FPGA]嵌入式系统FPGA设计资源

嵌入式系统FPGA设计资源 一、供应商 https://www.altera.com- Altera FPGA 供应商网站 https://www.altera.com/events/northamerica/intel-soc-fpga-developer-forum/overview.html- SoC 开发人员论坛 https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/li…

ClickHouse 可观测性最佳实践

ClickHouse 介绍 ClickHouse 是一款高性能、列式存储的开源分析型数据库,专为在线分析处理(OLAP)场景设计。它能够处理海量数据,支持实时查询和复杂的数据分析,具备极高的读写性能和数据压缩能力。ClickHouse 提供了强…

Android Framework设置时间为24小时制

文章目录 定位源码实现附录12 小时制与 24 小时制的详细解析一、基本定义与核心区别二、转换方法与示例三、应用场景与文化差异四、延伸知识:特殊计时制与历史背景 目的是把设置中使用默认语言区域关掉,并把使用24小时制打开 如下图为原始的:…

基于STM32设计的扫地机器人

一、前言 1.1 项目介绍 【1】项目开发背景 随着社会节奏的加快和人们生活方式的改变,智能家居产品逐渐走入千家万户。作为智能清洁系统的重要组成部分,扫地机器人凭借其自动化、高效性和便捷性,成为现代家庭中不可或缺的智能设备之一。传统…

什么是接口测试?

2025最新Jmeter接口测试从入门到精通(全套项目实战教程) 接口测试概念 接口测试是项目测试的一部分,它测试的主要对象是接口,是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与所测系统之间以及内部各系统之间的交…

JDY-23蓝牙模块与电脑的连接方式

JDY-23蓝牙模块支持多种连接方式,包括SPP(串口通信)模式和BLE(低功耗蓝牙)模式。以下是与电脑连接的具体方法: 1. 通过SPP模式连接 JDY-23模块支持SPP协议,可以通过串口与电脑通信。以下是连接…

【网络】Linux 内核优化实战 - net.core.rmem_max

目录 参数作用与原理默认值与查看方法调整场景与方法适用场景调整方法 与其他参数的协同性能影响与注意事项典型案例总结 net.core.rmem_max 是 Linux 内核中控制 套接字接收缓冲区(Receive Buffer)最大允许值 的参数。它与 net.core.rmem_default&#…