【CMake保姆级教程】CMake图文安装教程

news/2025/1/3 5:58:59/

文章目录

  • 一、CMake概况
  • 二、安装Ubuntu CMake
  • 三、简单的CMake实验
    • 如何使用CMake
    • 测试代码
    • 执行CMake
  • 总结


一、CMake概况

CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。

而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,在根据编译平台自动生成本地化的Makefile和工程文件,最后用户只需make编译即可,所以可以把CMake看成一款自动生成 Makefile的工具,其编译流程如下图:

在这里插入图片描述

CMake优点:

  • 跨平台
  • 能够管理大型项目
  • 简化编译构建过程和编译过程
  • 可扩展:可以为 cmake 编写特定功能的模块,扩充 cmake 功能

二、安装Ubuntu CMake

  1. 打开终端
    在这里插入图片描述

  2. 执行以下命令以更新软件包索引:

sudo apt update

在这里插入图片描述

  1. 安装 CMake
sudo apt install cmake

在这里插入图片描述因为我已经安装了CMake,大家执行这个命令就行了,我在此就不多演示了。

  1. 如果系统提示需要确认,请输入密码并按下 Enter 键以继续安装。
  2. 完成安装后,你可以通过运行以下命令来验证 CMake 是否成功安装:
cmake --version

在这里插入图片描述
我的CMake版本是3.22.1,下载的其他版本影响不大,后面可以编写CMake的时候可以调整。

三、简单的CMake实验

如何使用CMake

我们使用CMake需要编写一个CMakeLists.txt里面放的是CMake命令。
编写好之后执行cmake .(用于CMake文件在本级目录的)/cmake ..(用于CMake在父级目录的)
执行好后,找到makefile所在的文件夹,执行make

测试代码

测试main.c

#include <stdio.h>extern void func();int main()
{func();return 0;
}

测试func.c:

#include <stdio.h>void func()
{printf("Hello CMake");
}

测试CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)#指定版本
project(test)#指定我这个项目的名称,不是可执行文件的名称
add_executable(app main.c func.c)#app是可执行文件 后面的是源文件 中间用空格隔开

执行CMake

1、打开终端,打开CMakeLists.txt所在的文件夹
执行下面的命令

cmake .

在这里插入图片描述
终端就会输出这些东西,我们的文件夹也会多出很多东西。

2、终端打开CMakeLists.txt同级文件夹。
执行makefile命令

make

在这里插入图片描述
我们就会看到上面的景象。

3、执行可执行文件

./app

在这里插入图片描述
最终结果如上所示。

总结

CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。

我们使用CMake的时候只需要cmakemake一下就可以,非常快速简单。


http://www.ppmy.cn/news/984132.html

相关文章

[SQL挖掘机] - 左连接: left join

介绍: 左连接是一种多表连接方式&#xff0c;它以左侧的表为基础&#xff0c;并返回满足连接条件的匹配行以及左侧表中的所有行&#xff0c;即使右侧的表中没有匹配的行。左连接将左表的每一行与右表进行比较&#xff0c;并根据连接条件返回结果集。 左连接的工作原理如下&am…

如何运用R语言进行Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合实践与拓展

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

go语言中defer执行顺序

defer 执行顺序和调用顺序相反&#xff0c;类似于栈后进先出。 defer在 return 之后执行&#xff0c;但在函数推出之前&#xff0c;defer可以修改返回值。 func test() int {i : 0defer func() {fmt.Println("defer1")}()defer func() {i 1fmt.Println("defe…

k8s exam

Pause 容器是 Pod 中的第一个启动的容器&#xff0c;其他所有的用户容器都是其子进程当 Pod 被从节点中删除时&#xff0c;与之关联的 emptyDir 中的数据也将被永久删除。持久存储用PV&#xff0c;PVCService 资源定义了如何访问应用&#xff0c;但实际的网络流量管理和路由是由…

结构型-外观模式(Facade Pattern)

概述 外观模式是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问子系统中的一组接口。通过在外观类中定义一个高层接口&#xff0c;外观模式隐藏了子系统的复杂性&#xff0c;并将客户端与子系统的内部逻辑解耦。 优点&#xff1a; 简化了客户端…

11-2_Qt 5.9 C++开发指南_QSqlQueryModel的使用(QSqlQueryModel 只能作为只读数据源使用,不可以编辑数据)

文章目录 1 QSqlQueryModel 功能概述2 使用 QSqlQueryModel 实现数据查询2.1 实例功能2.2 可视化UI设计2.3 主窗口类定义&#xff08;去除自动生成的槽函数&#xff09;2.4 打开数据库2.5 记录移动 1 QSqlQueryModel 功能概述 从下图中可以看到&#xff0c;QSqlQueryModel 是 …

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

golang代码&#xff1a; package main import ( "context" "net" "net/rpc" "github.com/powerman/rpc-codec/jsonrpc2" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg&quo…

P5720 【深基4.例4】一尺之棰

题目描述 《庄子》中说到&#xff0c;“一尺之棰&#xff0c;日取其半&#xff0c;万世不竭”。第一天有一根长度为 a a a 的木棍&#xff0c;从第二天开始&#xff0c;每天都要将这根木棍锯掉一半&#xff08;每次除 2 2 2&#xff0c;向下取整&#xff09;。第几天的时候木…