CMake 教程跟做与翻译

news2024/11/25 11:28:26

目录

STEP 1: 入门与理解

cmake_minimum_required设置CMake版本的最小值

project声明工程属性

add_executable添加可执行文件

使用CMake构建工程

根据自己的构建工具自行构建

Reference


STEP 1: 入门与理解

我们起手的,最基本的 CMake 项目是从单个源代码文件构建的可执行文件。对于像这样的简单项目,只需要一个包含三个命令的 CMakeLists.txt 文件即可。

cmake_minimum_required(VERSION 3.30)
​
project(CharliesDemo)
​
add_executable(CharliesDemo lib.c main.c)

如你所见,就是这样的简单,对应的文件树如下:

├── CMakeLists.txt
├── lib.c
├── lib.h
└── main.c

注意:尽管 CMake 支持大写、小写和混合大小写命令,但首选小写命令,并将在整个教程中使用小写命令。

任何项目的最顶层 CMakeLists.txt 都必须通过使用 cmake_minimum_required() 命令指定最低 CMake 版本来开始。这将建立策略设置并确保以下 CMake 函数使用兼容版本的 CMake 运行。

要启动项目,我们使用 project() 命令来设置项目名称。每个项目都需要此调用,并且应在cmake_minimum_required() 之后立即调用。正如我们稍后将看到的,此命令还可用于指定其他项目级信息,例如语言或版本号。

最后,add_executable() 命令告诉 CMake 使用指定的源代码文件创建可执行文件。

cmake_minimum_required设置CMake版本的最小值

格式很简单,我们需要在一份CMake构建文本的最开头使用这个命令

cmake_minimum_required(VERSION 3.30)

这是因为不同版本的CMake对指令的支持程度不一致,有的时候必须要使用指定的版本进行构建。这里指定的是当前最新的3.30进行构建,对于自己的机器上,可以找到自己使用的cmake然后输入

cmake --version

返回自己使用cmake的版本进行参考。

project声明工程属性

cmake当然需要知道我们构建的目标工程的名称,以及使用的语言等其他的信息。一个完整版的project指令比较复杂。笔者目前的工程比较小,因此常常使用到的无非就是名称,当然这是其更加完善的形式:

project(<PROJECT-NAME>
        [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
        [DESCRIPTION <project-description-string>]
        [HOMEPAGE_URL <url-string>]
        [LANGUAGES <language-name>...])

add_executable添加可执行文件

在我们只有零星几个文件的时候,这个指令只需要在目标后面光光添加文件就行,这如同我们的demo那样:

add_executable(CharliesDemo lib.c main.c)

就是将我们的project名称作为一个目标CharliesDemo,他由lib.c main.c构成。

值得注意的是,这个目标名是随意的!我们不一定非的是CharliesDemo这个ProjectName,他可以是任何你要的可执行文件名称:比如说我们修改脚本:

cmake_minimum_required(VERSION 3.30)
project(CharliesDemo)
add_executable(AnythingElse lib.c main.c)

使用CMake构建工程

写完CMakeLists了,我们就需要构建。这里先不讨论更加复杂的构建方式,就简单谈谈如何构建上述简单的小工程!

笔者建议在任何其他地方设置一个构建的目录build。作为演示,我们直接在源码路径下新建一个build文件夹存放任何编译Middlewares,这样,不会打乱源代码文件夹下的文件,方便我们查看索引!

我们首先创建一个build文件夹:

mkdir build

随后进入这个文件夹。一般的我们cmake不带任何参数说明的参数默认是源代码路径:

tree .
​
├── build
├── CMakeLists.txt
├── lib.c
├── lib.h
└── main.c
pwd
path/to/demo/build
cmake ..

cmake随后会输出一些构建信息,笔者的输出如下

➜  cmake ..
# 告知使用的编译器版本
-- The C compiler identification is GNU 14.2.1
-- The CXX compiler identification is GNU 14.2.1
# 检查C ABI
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
# 检查特性是否符合构建要求
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.8s)
# 看到这里基本上没问题了——我们在Linux下默认生成的是Makefile,Windows则是会生成VS build Sln文件
# 当然你可以自己调整
-- Generating done (0.0s)
# 这里告诉你文件写到何处
-- Build files have been written to: /home/Charliechen/Works/cmake_learning/build

根据自己的构建工具自行构建

如果您设置了其他的构建工具——请自行查阅构建方式。笔者使用的Makefile很简单:make就行。

make
[ 33%] Building C object CMakeFiles/AnythingElse.dir/lib.c.o
[ 66%] Building C object CMakeFiles/AnythingElse.dir/main.c.o
[100%] Linking C executable AnythingElse
[100%] Built target AnythingElse

这样我们就拿到了可用的可执行文件。

Reference

cmake_minimum_required — CMake 3.30.4 Documentation

project — CMake 3.30.4 Documentation

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

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

相关文章

一篇教你玩转腾讯混元大模型!

0 前言 腾讯混元大模型&#xff08;Tencent Hunyuan&#xff09;具备&#xff1a; 强大的中文创作能力复杂语境下的逻辑推理能力可靠的任务执行能力 基于混元大模型&#xff0c;腾讯云推出文本生成、图像创作、视频创作产品方案&#xff0c;覆盖全场景AIGC应用&#xff1a; …

如何在 Kubernetes 上部署 Spark

在 Kubernetes 集群中部署 Apache Spark&#xff0c;需要你具备对 Kubernetes 的工作原理、Spark 的架构以及云原生应用的理解。 前期准备工作 在进行 Spark 的部署之前&#xff0c;需要对你的 Kubernetes 环境做好充分的准备。这包括 Kubernetes 集群的搭建以及基础工具的安…

【大模型理论篇】大模型相关的周边技术分享-关于《NN and DL》的笔记

本文所要介绍的一本书《Neural Networks and Deep Learning》&#xff0c;该书作者Michael Nielsen&#xff0c;Y Combinator Research的研究员&#xff0c;是多年之前自己看的一本基础书籍&#xff0c;很适合入门了解一些关于深度学习的概念知识&#xff0c;当然也包含了一些小…

华为OD机试 - 日志限流 - 二分查找(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

毕业设计——springboot + VUE实现后台管理系统(集成JWT接口权限验证)

作品详情 - 高质量的代码、代码结构、和代码注释 - 漂亮的UI&#xff0c;菜单栏、标签页&#xff0c;体验、交互更好用的员工、部门、角色、菜单管理等等 - 优化基于Keepalive的标签页&#xff0c;做到标签页该缓存的时候缓存&#xff0c;比如左右切换等&#xff0c;不该缓存的…

二、图解C#教程

一、方法 {}块&#xff0c;里面的是方法体 二、Var关键字 推断出等号右边的实际类型 三、局部常量 1、声明时必须初始化 2、声明后不能改变

虚拟内存能不能完全关了?太占空间了……

前言 这几天咱们提到关于Swap区&#xff08;就是Linux上的数据交换分区&#xff09;&#xff0c;在Windows上这个功能被称为虚拟内存。 前段时间&#xff08;应该是很早之前&#xff09;&#xff0c;小白写过一篇关于虚拟内存的文章&#xff1a; Windows调大虚拟内存来代替升…

常见激活函数总结

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一. 激活函数的定义 激活函数&#xff08;Activation Function&#xff09;是人工神经网络中对每个神经元的输入进行非线性变换的函数。神经网络中的每个神经元都会接受来自上一层的输入&#xf…

qt_c++_xml存这种复杂类型

demo&#xff0c;迅雷链接。或者我主页上传的资源 链接&#xff1a;https://pan.xunlei.com/s/VO8bIvYFfhmcrwF-7wmcPW1SA1?pwdnrp4# 复制这段内容后打开手机迅雷App&#xff0c;查看更方便 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>#include…

【MySQL】使用 JDBC 连接数据库

文章目录 前言1. 认识 JDBC1.1 概念1.2 好处 2. 使用 JDBC2.1 安装数据驱动包2.2 把 jar 包导入到项目中2.3 代码编写2.4 测试结果 3. 代码优化4. 源码展示结语 前言 在 MySQL 系列中&#xff0c;我们介绍了很多内容&#xff0c;包括但不限于建库建表&#xff0c;增删查改等等…

如何使用MATLAB代码生成器生成ADRC跟踪微分器(TD) PLC源代码(SCL)

ADRC线性跟踪微分器TD详细测试 ADRC线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)-CSDN博客文章浏览阅读383次。ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和…

图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网)

图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网&#xff09; 思维导图汇总深度优先搜索理论基础98.所有可达路径(卡码网)1.邻接矩阵法2.邻接表法 思维导图汇总 深度优先搜索理论基础 深度优先搜索&#xff08;dfs&#xff09;与广度优先搜索&#xff08;bfs&#xf…

@Transactional声明式事务回调编程

文章目录 1. 理论阐述2. 代码实现2.1. 问题代码2.2. 改进方案 本文参考&#xff1a; 事务回调编程 大事务问题 1. 理论阐述 最近在学习数据库事务的过程中&#xff0c;了解到了大事务的危害&#xff1a; 并发情况下&#xff0c;数据库连接资源容易耗尽锁定数据较多&#xff0…

SpringBoot企业级开发(SpringSecurity安全控制+pringBatch批处理+异步消息+系统集成SpringIntegration)

Spring Security 多个过滤器来实现所有安全的功能&#xff0c;只需要注册一个特殊的DelegatingFilterProxy过滤器到WebAppliationInitializer即可 实际使用中需要让自己的Initializer类继承AbstractSecurity WebApplicationInitializer抽象类即可。 AbstractSecurityWebAppli…

【瑞昱RTL8763E】刷屏

1 显示界面填充 用户创建的各个界面在 rtk_gui group 中。各界面中 icon[]表对界面进行描述&#xff0c;表中的每个元素代表一 个显示元素&#xff0c;可以是背景、小图标、字符等&#xff0c;UI_WidgetTypeDef 结构体含义如下&#xff1a; typedef struct _UI_WidgetTypeDef …

每年每门学科排名第一的学生 和每年总成绩都有所提升的学生

一张学生成绩表(student_scores)&#xff0c;有year-学年&#xff0c;subject-课程&#xff0c;student-学生&#xff0c;score-分数这四个字段&#xff0c;请完成如下问题&#xff1a; 问题1&#xff1a;每年每门学科排名第一的学生 问题2&#xff1a;每年总成绩都有所提升的…

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理 本文参考移植步骤文件配置代码修改inv_mpu.cinv_mpu.hinv_mpu_dmp_motion_driver.c 使用 自检失败怎么处理ret -1改正DEBUG过程 ret -9改正DEBUG过程 本文参考 B站 CSDN 移植步骤 文件配置 新建一个 dmp 文件夹 并将…

【斯坦福CS144】Lab1

一、实验目的 1.实现一个流重组器——一个将字节流的小块 &#xff08;称为子串或段 &#xff09;按正确顺序组装成连续的字节流的模块&#xff1b; 2.深入理解 TCP 协议的工作方式。 二、实验内容 编写一个名为"StreamReassembler"的数据结构&#xff0c;它负责…

【Nacos入门到实战十四】Nacos配置管理:集群部署与高可用策略

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

原神5.1前瞻网页HTML+CSS+JS

这篇文章主要是总结一下我在制作页面的时候用到的一些技术以及经验总结&#xff0c;博主也是第一次写网页&#xff0c;代码也是在不断地“进化”&#xff0c;哪里写的不好大家可以随意指出。 下面就是一些经验总结&#xff0c;如果想看具体效果我这里也不好展示&#xff0c;需要…