CMake 教程跟做与翻译

目录

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.rhkb.cn/news/440715.html

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

相关文章

【Blender Python】1.概述和基础使用

概述 众所周知&#xff0c;Blender是一款开源免费的3D建模软件&#xff08;当然不限于3D建模&#xff09;。在Blender中&#xff0c;可以使用其内置的Python解释器执行Python代码&#xff0c;用于程序化的生成网格以及其他内容。你可以基于此创建Blender插件。 这个系列就是快…

Electron桌面应用打包现有的vue项目

1 环境准备 Node&#xff1a;v16.20.2&#xff08;本地vue项目nodejs版本&#xff09;Electron&#xff1a;22.3.7vue&#xff1a;2 版本管理 2 Vue项目准备 更新相关依赖npm install --registry https://registry.npmmirror.com/npm run dev 3、引入Electorn 安装指定版…

算法剖析:双指针

文章目录 双指针算法一、 移动零1. 题目2. 算法思想3. 代码实现 二、 复写零1. 题目2. 算法思想3. 代码实现 三、 快乐数1. 题目2. 算法思想3. 代码实现 四、 盛水最多的容器1. 题目2. 算法思想3. 代码实现 五、有效三角形的个数1. 题目2. 算法思想3. 代码实现 六、 和为 s 的两…

UART驱动学习三(TTY驱动部分源码解析)

目录 全局框架图一、tty_io.c 分析1. 关键数据结构和定义2. 文件操作结构体3. 初始化和注册4. 读写操作5. 挂起和恢复6. 信号处理7. 设备类8. 控制台通知9. 辅助函数10. 代码功能11. 带有注释的部分tty_io.c源码 二、tty_ldisc.c 分析1. 关键数据结构和定义2. 行规程操作函数3.…

Android车载——VehicleHal运行流程(Android 11)

1 概述 本篇主要讲解VehicleHal的主要运行流程&#xff0c;包括设置属性、获取属性、订阅属性、取消订阅、持续上报属性订阅等。 2 获取属性流程 2.1 获取属性流程源码分析 作为服务注册到hwServiceManager中的类是VehicleHalManager&#xff0c;所以&#xff0c;CarServic…

判断是否为二叉排序树(二叉搜索树,二叉查找树)

1.判断给定的二叉树是否为二叉排序树&#xff0c;如果是返回1&#xff0c;不是返回0。 思想&#xff1a; 二叉树是左子树<根<右子树。中序遍历是递增有序&#xff0c;可以通过比较当前结点与前驱关系来进行判断。 代码&#xff1a; //pre为全局变量&#xff0c;保存当…

数学与生活

多学科交叉 信号处理 小波 经济 政策 计算机 统计 信号处理与市场分析 经济与数据分析 政策与统计 过去的数学家没有一个是纯粹的数学家&#xff1b;生活中各方面工程的&#xff0c;物理的&#xff0c;天文&#xff0c;地理的&#xff0c;赌博&#xff0c;政治的&#xff1b…

5-25 JQuery

jQuery简介 jQuery是什么 jQuery基本语法 测试jQuery <head> <meta charset"utf-8"> <title>无标题文档</title><script type"text/javascript" src"jquery-3.5.1.js"></script><script type"tex…

FastAdmin Apache下设置伪静态

FastAdmin Apache下设置伪静态 一、引言 FastAdmin 是一个基于ThinkPHP和Bootstrap框架开发的快速后台开发框架&#xff0c;它以其简洁、高效、易于扩展的特点&#xff0c;广受开发者的喜爱。在部署FastAdmin项目时&#xff0c;为了提高访问速度和用户体验&#xff0c;我们通…

Redis介绍及整合Spring

目录 Redis介绍 Spring与Redis集成 Redis介绍 Redis是内存数据库&#xff0c;Key-value型NOSQL数据库&#xff0c;项目上经常将一些不经常变化并且反复查询的数据放入Redis缓存&#xff0c;由于数据放在内存中&#xff0c;所以查询、维护的速度远远快于硬盘方式操作数据&#…

【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解

目录 1、FileChannel (1&#xff09;获取 FileChannel (2&#xff09;读取文件 (3&#xff09;写入文件 (4&#xff09;关闭通道 (5&#xff09;当前位置与文件大小 (6&#xff09;强制写入磁盘 2、两个 FileChannel 之间的数据传输 (1&#xff09;使用 transferTo()…

leetcode-42. 接雨水 单调栈

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

微软发布Windows 11 2024更新,新型Copilot+ AI PC功能亮相

前言 微软在Windows 11的2024更新中加强了对人工智能的应用&#xff0c;推出了新功能Copilot。 此次更新的版本号为26100.1742&#xff0c;Copilot将首先在Windows Insider中推出&#xff0c;计划于11月向特定设备和市场推广&#xff0c;用户需开启“尽快获取最新更新”选项以…

RESTful风格接口+Swagger生成Web API文档

RESTful风格接口Swagger生成Web API文档 文章目录 RESTful风格接口Swagger生成Web API文档1.RESTful风格接口RESTful简介RESTful详细图示常见http状态码springboot实现RESTfulRESTful springboot设计实例demo 2.Swagger生产Web API文档Swagger简介使用Swagger1.加入依赖2.配置S…

基于STM32的超声波测距仪设计

引言 本项目将基于STM32微控制器设计一个超声波测距仪&#xff0c;通过超声波传感器实现距离测量&#xff0c;并将结果显示在液晶屏上。该项目展示了STM32微控制器与超声波传感器、LCD显示器的接口通信&#xff0c;以及信号处理和距离计算的过程。 环境准备 1. 硬件设备 ST…

技术速递|Python in Visual Studio Code 2024年9月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布将于 2024 年 9 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展&#xff01; 此版本包括以下公告&#xff1a; Django 单元测试支持使用 Pylance 从 inlay 提示转到定义 如果您有兴趣&#xff0c;可以在我们的 Pyth…

提升 CI/CD 稳定性:Jenkins 开机自检与推送通知

简介&#xff1a;Jenkins 是一个广泛使用的开源自动化服务器&#xff0c;常用于持续集成和持续交付。在某些情况下&#xff0c;服务器重启可能导致 Jenkins 构建任务中断或失败。为了解决这个问题&#xff0c;可以使用一个自检服务&#xff0c;定期检查系统的启动时间&#xff…

算法题总结(十)——二叉树上

#二叉树的递归遍历 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result new ArrayList<Integer>(); //也可以把result 作为全局变量&#xff0c;只需要一个函数即可。…

Open3D实现点云数据的序列化与网络传输

转载自个人博客&#xff1a;Open3D实现点云数据的序列化与网络传输 在处理点云数据的时候&#xff0c;有时候需要实现点云数据的远程传输。当然可以利用传输文件的方法直接把点云数据序列化成数据流进行传输&#xff0c;但Open3D源码在实现RPC功能时就提供了一套序列化及传输的…

今日指数day8实战补充用户管理模块(下)

ps : 由于前端将userId封装为BigInt类型 , 导致有精度损失, 传入的userId不正确 , 部分功能无法正确实现 , 但是代码已经完善 1.4 更新用户角色信息接口说明 1&#xff09;原型效果 2&#xff09;接口说明 功能描述&#xff1a;更新用户角色信息 服务路径&#xff1a;/user/…