Cmake(1)——Cmake的基本介绍和原理、Cmake的安装、如何使用Cmake构建项目
Cmake的基本介绍和原理、Cmake的安装、如何使用Cmake构建项目
插播!插播!插播!亲爱的朋友们,我们的Cmake课程上线啦!感兴趣的小伙伴可以去下面的链接学习哦~
https://edu.csdn.net/course/detail/39261
1、Cmake的基本介绍和原理
在探讨 CMake 之前,首先需明确 CMake 的本质。CMake,作为一个高级的构建工具,与传统的 Makefile 相比,具有更为强大和灵活的特性。它不仅简化了项目的构建过程,还为跨平台开发提供了便利。
CMake 之所以被视为比 Makefile 更高级的工具,主要是因为它采用了更为简洁和直观的语法。传统的 Makefile 需要编写繁琐的规则和指令,而 CMake 则使用一种类似于自然语言的描述方式,使得项目的配置变得更加简单、明了和人性化。这种直观的语法使开发者能够轻松理解项目的构建逻辑,从而减少了对专业知识的依赖。
另一个 CMake 的显著优点是跨平台支持。在不同操作系统平台上进行开发时,由于平台差异导致的构建规则的差异往往是一个让人头疼的问题。Makefile 需要在不同的平台上进行特定的修改和调整,以适应不同平台的构建规则。然而,CMake 能够根据目标平台的特性自动生成适应的构建文件,如 Makefile 或 Visual Studio 项目文件等。这意味着开发者可以在不同的操作系统上使用相同的 CMake 配置文件,从而简化了项目的移植和维护工作,减少了工作量和技术门槛。
除了语法简洁性和跨平台支持外,CMake 还具备强大的灵活性和可扩展性。通过编写 CMake 模块和添加自定义命令,开发者可以轻松地扩展 CMake 的功能,满足项目的特殊需求。这种灵活性使得 CMake 不仅适用于常规的软件开发项目,还适用于各种复杂的工程场景。此外,CMake 支持多种编程语言,包括 C、C++、Fortran 等,使得它成为跨语言项目的理想选择。这为多语言混合项目提供了极大的便利性,减少了不同语言之间的兼容性问题。
在处理大型项目时,CMake 的优势尤为明显。大型项目通常涉及复杂的依赖关系、模块化构建和高度可配置的构建过程。CMake 提供了强大的功能来管理这些复杂的构建关系,使得大型项目的编译和构建过程更加高效和可靠。通过合理配置和管理依赖关系,CMake 可以有效地减少构建时间和资源消耗,提高构建的一致性和可靠性。此外,CMake 还支持并行构建和增量构建等优化技术,进一步提高了大型项目的构建效率。
综上所述,CMake 是一个强大、灵活且跨平台的构建工具。通过学习并掌握 CMake 的使用,开发者可以更加高效地构建和管理项目,为未来的复杂项目做好准备。无论是在语法简洁性、跨平台支持、灵活性还是在大规模项目管理方面,CMake 都表现出色并值得推荐给那些追求高效的开发者和项目团队使用。
2、Cmake的安装
在完成CMake的基本介绍和原理讲解之后,我们接下来将步入实际操作环节,首先便是安装CMake。为了让读者更好地理解和操作,我们将以Ubuntu、Debian以及其他基于Debian的Linux发行版为例,介绍CMake的安装过程。
**安装CMake**
在Ubuntu、Debian以及其他基于Debian的Linux发行版上,可以使用以下命令来安装CMake:
sudo  apt-get  updatesudo  apt-get  install  cmake这个命令将自动下载并安装CMake。在安装过程中,系统可能会要求您输入密码。输入密码后,安装过程将自动进行。
**检查安装结果**
安装完毕后,我们可以通过指令`cmake -version`来检查是否安装成功。输入该命令后,终端会输出CMake的版本信息。例如:
cmake  --version如果安装成功,终端将显示如下信息:
cmake version3.16.5
这表示您已成功安装了CMake。
3、如何使用Cmake构建项目
当我们遇到一个成熟的项目,如何运用Cmake来构建它,并顺利完成各个阶段的操作呢?接下来,我们将一步一步地带领大家使用Cmake构建cpp项目,让大家对Cmake的运用更加得心应手。在此,我随机挑选了一个项目来进行演示,让大家更直观地了解Cmake的操作过程。
一般来说,一个项目中包含源代码文件、头文件以及CMakeLists.txt文件。为了便于管理,我们通常会创建以下几个目录:
- 一个子目录用于存放源代码文件,这个目录一般被称为src目录。
- 另一个子目录用于存放头文件,这个目录被称为include目录。
- 项目目录下创建一个名为CMakeLists.txt的文件,用于配置和构建项目。

CMakeLists文件在构建项目中扮演着至关重要的角色。它不仅是CMake系统的基础,而且还是项目信息的主要载体。CMakeLists文件主要告诉CMake如何读取项目的基本信息,包括项目的名称、版本、所支持的C++标准等。同时,它还包含了一些关键的配置信息,比如链接库和编译器选项等。
在学习CMake的过程中,了解CMakeLists文件中常用的命令是十分必要的。通过这些命令,我们可以更好地控制项目的构建过程,提高构建效率。在后续的教程中,我们将深入探讨CMakeLists文件的各个部分,帮助大家全面理解其结构和功能。
首先,我们将介绍如何设置项目的基本信息,包括项目名称、版本号和支持的C++标准等。这些信息对于CMake正确理解项目需求至关重要。
其次,我们将探讨如何配置编译器和构建工具。编译器是代码编译的关键环节,而构建工具则负责管理构建过程。通过合理配置这些工具,我们可以确保代码以最优的方式进行编译和构建。
再者,链接库的配置也是一项重要的任务。在项目中,我们可能需要使用到一些第三方库。通过CMakeLists文件,我们可以方便地添加和管理这些库,确保项目能够正确地链接到所需的库文件。
此外,我们还将讨论如何规划项目结构。一个清晰的项目结构有助于提高代码的可维护性和可读性。通过合理地组织项目文件和目录结构,我们可以更好地管理项目资源和代码。
最后,我们将涉及一些其他的配置选项,如调试、优化和测试等。这些选项对于项目的完整构建和调试至关重要。通过掌握这些高级配置,我们可以进一步优化项目的构建过程。
在掌握makefile之后,我们会发现,CMake的主要应用便是编写cmakelists.txt。实际上,相较于makefile,cmakelists.txt的编写难度较低,CMake的语法简洁明了,即便是对初学者而言,也能迅速掌握。而makefile的语法则相对较为复杂,需要经过一定的学习和实践经验才能熟练运用。然而,学习makefile也具有一定的优势,对此感兴趣的朋友可以关注我们的makefile课程。
因此,我建议大家如有空闲时间,务必充分学习并掌握CMake的相关知识。
在进行CMake操作时,遵循一定的规范可以让你的工作更加高效,同时保持源代码的整洁。下面是一个规范的CMake操作流程的详细步骤:
首先,为了保持源代码的干净,我们需要将构建文件放在一个独立的目录中。这个目录可以命名为“build”,这样既能方便区分源代码和构建文件,也便于后续的操作。
接下来,进入“build”目录。你可以使用“cd”命令切换到这个目录,这样就可以在这个目录下进行后续的操作。
然后,运行CMake命令,指定CMakeLists。在“build”目录下,你需要使用CMake命令来生成构建文件。在这个过程中,你需要指定CMakeLists的路径,以便告诉CMake在哪里可以找到CMakeLists。这个路径可以是相对路径或绝对路径,只要CMake能够正确识别即可。

在执行CMake命令之后,build目录中会生成相应的Makefile。

通过运行`make`命令,开始构建项目。在此过程中,`make`将自动对源代码文件进行编译,并链接生成可执行文件。
相关文章:
 
Cmake(1)——Cmake的基本介绍和原理、Cmake的安装、如何使用Cmake构建项目
Cmake的基本介绍和原理、Cmake的安装、如何使用Cmake构建项目 插播!插播!插播!亲爱的朋友们,我们的Cmake课程上线啦!感兴趣的小伙伴可以去下面的链接学习哦~ https://edu.csdn.net/course/detail/39261 1、Cmake的基…...
 
Spring Boot程序的打包与运行:构建高效部署流程
引言 在现代应用开发中,高效的打包和部署流程对于项目的开发、测试和上线至关重要。Spring Boot作为一种快速开发框架,提供了方便的打包工具和内嵌式的Web服务器,使得打包和运行变得更加简单。本文将研究在Spring Boot应用中如何进行打包&am…...
 
【Linux取经路】初探进程地址空间
文章目录 一、历史问题回顾二、语言层面的地址空间2.1 验证 三、虚拟地址的引入3.1 初步解释这种现象——引入地址空间的概念3.2 再来粗粒度理解上面的现象 四、细节解释4.1 地址空间究竟是什么?4.2为什么要有地址空间4.3 页表4.3.1 CR3寄存器4.3.2 页表是由页表项组…...
 
.net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
像java使用autowrite一样使用 1、前提先注册到ioc容器当中 builder.Services.AddScoped 2、nuget引入AutoWrite4Net 3、启用 //启用自动注入 app.UseAutoWrite(); 4、在类上使用注解 [StartAutoWrite] public class NacosController : ControllerBase 5、实例上使用注解 …...
 
LeetCode、2300. 咒语和药水的成功对数【中等,排序+二分】
文章目录 前言LeetCode、2300. 咒语和药水的成功对数【中等,排序二分】题目及类型思路及代码 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域…...
 
【MyBatis-Plus】逻辑删除
对于一些比较重要的数据,我们通常采用逻辑删除。(即用一个字段表示是否删除,实际上始终在数据库没有被删除) 当逻辑删除字段为 true,业务处理的时候会自动把该数据当做一个“不存在”的数据处理。(即不处理…...
 
Rust基础语法1
所有权转移,Rust中没有垃圾收集器,使用所有权规则确保内存安全,所有权规则如下: 1、每个值在Rust中都有一个被称为其所有者(owner)的变量,值在任何时候只能有一个所有者。 2、当所有者离开作用域…...
【算法基础 数学】快速幂
题目描述 给定 n n n组 a i , b i , p i a_i,b_i,p_i ai,bi,pi,对于每组数据,求出 a i b i m o d p i a_i^{b^i}~mod~p_i aibi mod pi 的值。 样例 输入样例: 2 3 2 5 4 3 9输出样例: 4 1快速幂解决的问题 用来…...
2024年华为OD机考高分攻略-完整题库-两周350分
华为OD是个不错的机会,很适合非软件行业到软件行业的转身。 但是很多同学之前没有软件基础,不知道该如何高效的准备OD机考。 我是一名软件培训老师,我的学生有上百人顺利通过了华为OD机考,并取得了高分,我将经验分享…...
 
【微信小程序独立开发 4】基本信息编辑
这一节完成基本信息的编辑和保存 首先完成用户头像的获取 头像选择 需要将 button 组件 open-type 的值设置为 chooseAvatar,当用户选择需要使用的头像之后,可以通过 bindchooseavatar 事件回调获取到头像信息的临时路径。 从基础库2.24.4版本起&…...
Docker-基础指令
前置知识 docker官网地址:https://www.docker.com/ docker镜像地址:https://hub.docker.com/ docker安装教程:https://docs.docker.com/engine/install/centos/ 安装只需要注意将仓库源改为国内就好,推荐去阿里云注册自己的账号获得加速地址…...
 
JUC-Java内存模型JMM
JMM概述 Java Meory Model java内存模型。在不同的硬件和不同的操作系统上,对内存的访问方式是不一样的。这就造成了同一套java代码运行在不同的操作系统上会出问题。JMM就屏蔽掉硬件和操作系统的差异,增加java代码的可移植性。这是一方面。 另一方面JM…...
 
uni-app使用HBuilderX打包Web项目
非常简单,就是容易忘记 一、找到manifest.json配置Web配置 二、源码视图配置 "h5" : {"template" : "","domain" : "xxx.xx.xx.xxx","publicPath" : "./","devServer" : {&quo…...
 
前后置、断言、提取变量、数据库操作功能
前置操作和后置操作都是 API 请求在发送和响应过程中执行的脚本,主要用于在发起 API 请求前和获得响应后完成验证或执行某些操作,目的是为了提高 API 调试和测试的效率,并确保接口的正确性。 前置操作 前置操作是在 API 请求之前执行的脚本…...
三子棋/井字棋(C语言)
这个游戏需要用到三个文件 game.h头文件用来申明函数和导包 game.h如下: #pragma once #define ROW 3 #define COL 3 #include <stdlib.h> #include <time.h> #include <stdio.h>//初始化棋盘的函数void InitBoard(char board[ROW][COL], int row, int co…...
 
数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა
目录 Contact.h说明: 结构体与头文件的包含: 编辑 函数在头文件的声明与定义: Contact.c中各个函数的实现: 1.检查链表中的数据是否满了,满了就扩容 2.链表的尾插 3.链表的删除 4.查找名字是否匹配 5.初始化通讯…...
 
Electron Apple SignIn 登录
本人写博客,向来主张:代码要完整,代码可运行,文中不留下任何疑惑。 最讨厌写博客,代码只留下片段,文中关键的东西没写清楚。之前看了那么多文章,就是不告诉我clientId从哪来的。 官方资料地址&…...
 
常用中间件漏洞
IIS6 IIS7 安装 控制面板-----打开关闭windows功能 添加角色-----添加IIS 启动之后访问localhost 复现 服务器换成IIS7 访问报错 大概就是缺少CGI模块 问题解决 添加php-cgi的路径 添加脚本映射 修改php.ini文件 将 cgi.fix_pathinfo1 然后设置一个图片 访问 在后缀加上/.…...
 
Windows系统使用手册
点击前往查看🔗我的博客文章目录 Windows系统使用手册 文章目录 Windows系统使用手册Windows10解决大小核调度问题Windows系统安装软件Windows系统Typora快捷键Windows系统压缩包方式安装redisWindows安装dockerWindows系统的docker设置阿里源Windows系统下使用doc…...
 
mp4文件可以转成mp3音频吗
现在是个非常流行刷短视频一个年代,刷短视似乎成了人们休闲娱乐的一种方式,在日常刷短视频过程中,肯定会有很多同学被短视频 bgm 神曲洗脑,比如很多被网红翻唱带火的歌曲,例如其中"不负人间”,就是其中…...
 
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
 
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
 
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
