CMake应用:基础篇

2023-11-05

CMake是一个开源、跨平台的编译、测试和打包工具,它使用比较简单的语言描述编译、安装的过程,输出Makefile或者project文件,再去执行构建。

在使用IDE开发软件的过程中,代码的编译和构建一般是使用IDE自带的编译工具和环境进行编译,开发者参与的并不算多。如果想要控制构建的细节,则需要开发者自己定义构建的过程。

本文主要介绍以下内容:

  1. 编译构建相关的核心概念及它们之间的关系

  2. CMake的一般使用流程

  3. 一个简单的实例

一 核心概念

1 gcc、make和cmake

gcc(GNU Compiler Collection)将源文件编译(Compile)成可执行文件或者库文件;

而当需要编译的东西很多时,需要说明先编译什么,后编译什么,这个过程称为构建(Build)。常用的工具是make,对应的定义构建过程的文件为Makefile

而编写MakeFile对于大型项目又比较复杂,通过CMake就可以使用更加简洁的语法定义构建的流程,CMake定义构建过程的文件为CMakeLists.txt

它们的大致关系如下图:

图片

这里的GCC只是示例,也可以是其他的编译工具。这里的Bin表示目标文件,可以是可执行文件或者库文件。

二 CMake一般使用流程

CMake提供cmake、ctest和cpack三个命令行工具分别负责构建、测试和打包。本文主要介绍cmake命令。

使用cmake一般流程为:

  1. 生成构建系统(buildsystem,比如make工具对应的Makefile);

  2. 执行构建(比如make),生成目标文件;

  3. 执行测试、安装或打包。

本文先介绍前面两个步骤。

1 生成构建系统

通过cmake命令生成构建系统。

通过cmake --help可以看到cmake命令支持的详细参数,常用的参数如下:

参数 含义
-S 指定源文件根目录,必须包含一个CMakeLists.txt文件
-B 指定构建目录,构建生成的中间文件和目标文件的生成路径
-D 指定变量,格式为-D <var>=<value>,-D后的空格可省略

比如,指明使用当前目录作为源文件目录,其中包含CMakeLists.txt文件;使用build目录作为构建目录;设定变量CMAKE_BUILD_TYPE的值为Debug,变量AUTHOR的值为RealCoolEngineer

cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DAUTHOR=RealCoolEngineer

使用-D设置的变量在CMakeLists.txt中生效,可以设置cmake的内置支持的一些变量控制构建的行为;当然也可以使用自定义的变量,在CMakeLists.txt中自行判断做不同的处理。

2 执行构建

使用cmake --build [<dir> | --preset <preset>]执行构建。

这里要指定的目录就是生成构建系统时指定的构建目录。常用的参数如下:

参数 含义
--target 指定构建目标代替默认的构建目标,可以指定多个
--parallel/-j [<jobs>] 指定构建目标时使用的进程数

在这一步,如果使用的是make构建工具,则可以在构建目录下直接使用make命令。

三 CMake应用示例

1 一个简单的例子

下面使用cmake编译一个c语言的hello world程序。创建一个项目文件夹cmake-template,目录结构如下:

cmake-template
├── CMakeLists.txt
└── src
    └── c
        └── main.c

main.c内容如下:

// @Author: Farmer Li, 公众号: 很酷的程序员/RealCoolEngineer
// @Date: 2021-04-24

#include <stdio.h>

int main(void) {
  printf("Hello CMake!");

  return 0;
}

CMakeLists.txt的内容如下:

cmake_minimum_required(VERSION 3.12)
project(cmake_template VERSION 1.0.0 LANGUAGES C CXX)

add_executable(demo src/c/main.c)

该CMakeLists.txt声明了需要使用的cmake的最低版本;项目的名字、版本以及编译语言;最后一句定义了通过源文件main.c生成可执行文件demo。

详细的CMake语法在本文暂不展开,后续会有专门的文章介绍,敬请关注(#^.^#)。

2 生成构建系统

cmake-template目录下,执行以下命令:

cmake -B build

执行完成后,在项目的根目录下会创建build目录,可以看到其中生成了Makefile文件。

3 执行构建

还是在cmake-template目录下,执行以下命令:

cmake --build build

因为使用的是make工具,所以也可以在build目录直接执行make命令:

cd build && make && cd -

执行完成后,可以在build目录下看到已经生成可执行文件demo,执行demo:

➜ cmake-template # ./build/demo
Hello CMake!

上面演示了一个CMake的简单demo,着重介绍CMake的使用流程和命令。下一篇文章会介绍CMake常用的核心语法和更加复杂的demo。

本文示例代码上传到开源仓库:cmake-template,链接:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake应用:基础篇 的相关文章

随机推荐

  • 扫盲-----addEventlistener()方法,事件监听(一)

    一 扫盲事件起因 时间 2018年6月1日周五下午 原本我以为我已经把当前的bug改好 应该没啥问题了 坐等下班公司聚餐 开心 突然 隔壁同组大哥 哎 cp 你看看 你这个首页报了很多错哎 我的第一反应就是 不可能 怎么会有错误呢 我明明都
  • osgEarth的Rex引擎原理分析(七十二)如何从高程影像变成高程网格

    目标 七十一 中的问题143 有两种方法 1 对高程影像进行采样 用采样值来设置高程 通过CPU实现 2 通过着色器来实现 在GPU上进行操作 待继续分析列表 9 earth文件中都有哪些options 九 中问题 10 如何根据earth
  • jQuery甘特图/日程图/横道图/插件

    基于JQ的一款灵活高效 支持自定义拓展的甘特图 日程图插件 支持月 周 小时等显示方式 支持拖动改变时间 展开与收起 添加 删除 刷新 节假日高亮 clicked dblClicked changed事件 调用方式 ganttChart g
  • 【备战csp-j】 csp常考题型详解(1)

    一 计算机基础知识 1 微型计算机的问世是由于 的出现 A 中小规模集成电路 B 晶体管电路 C 超 大规模集成电路 D 电子管电路 答案 C 解析 年代 元件 第一代 1946 1958 电子管 第二代 1959 1964 晶体管 第三代
  • Vue使用three.js的GLTFLoader导入外部模型绘制边界

    一 效果展示 threeJs渲染外部模型视频 二 项目引用 将OrbitControls和GLTFLoader引入到项目中 import as THREE from three 引入three import OrbitControls fr
  • NYOJ 586 疯牛 & POJ 2456(二分搜索 + 贪心)

    疯牛 时间限制 1000 ms 内存限制 65535 KB 难度 4 描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000
  • 设计模式(十五)-面向对象概念

    软件设计 十五 UML建模 下 https blog csdn net ke1ying article details 129152487 一 设计原则 1 单一职责 设计目的单一的类 2 开放 封闭原则 对扩展开放 对修改关闭 3 里氏替
  • Elasticsearch集群内存占用高?用这招!

    一 freeze index冻结索引介绍 Elasticsearch为了能够实现高效快速搜索 在内存中维护了一些数据结构 当索引的数量越来越多 那么这些数据结构所占用的内存也会越来越大 这是一个不可忽视的损耗 在实际的业务开展过程中 我们会
  • 电容触摸式操作面板按键方案选型

    系列文章目录 1 元件基础 2 电路设计 3 PCB设计 4 元件焊接 5 板子调试 6 程序设计 7 算法学习 8 编写exe 9 检测标准 10 项目举例 11 职业规划 文章目录 前言 方案一 触摸弹簧 方案二 ITO导电玻璃 银浆触
  • Python爬虫库

    网络 通用 urllib 网络库 stdlib requests 网络库 grab 网络库 基于pycurl pycurl 网络库 绑定libcurl urllib3 Python HTTP库 安全连接池 支持文件post 可用性高 htt
  • mysql create triggers_mysql 触发器的创建

    CREATE TRIGGER Syntax CREATE DEFINER user CURRENT USER TRIGGER trigger name trigger time trigger event ON tbl name FOR E
  • pycharm2019.3瘦身

    用过一段时间之后的发现c盘users里面有一个 pycharmCE的文件夹 500多M 之后还会越来越大 于是决定移动到d盘 第一步 在d盘新建一个文件夹 打开pycharm 点Help gt Edit Custom Properties
  • 断点续传-vue

    实现断点续传主题思路 对文件进行每200MB切片 基于spark md5计算出第一个切片文件的hash值 将文件的名称 大小 hash值传给后台 后台确认当前文件是否上传过 已上传过返回之前上传大小或第几个切片 前端再次上传切片 直到上传完
  • docker bi工具superset汉化

    很简单 修改一下superset config py 文件就可以了 但是 找文档花了三天时间 vim opt superset docker pythonpath dev superset config py 文件中添加如下内容即可 LAN
  • 在Visual Sutdio 2017中使用boost库

    对C 有一定了解的同学一定听说过boost库 这是C 的一个著名类库 在C 的地位感觉可以和Spring在Java中相比 boost向来有准标准库之称 很多新特性例如智能指针等都是先在boost中实现 后来被吸收到标准库之中 而且boost
  • WDS1期第12课 字符设备驱动 7 async异步通知用户空间 驱动代码的kill_fasync函数通知用户的signal函数 fcntl

    前面的query interrupt poll都需要用户程序去主动去读或查询 async异步通知 可以由驱动程序主动去通知用户程序中断的到来 信号也可以通知TASK INTERRUPTIBLE的进程 SIGKILL可以杀掉任何进程 就是传说
  • javascript之数据遍历

    JavaScript之数据遍历 for循环 var a 沐水莲心 22 男 for var i 0 i
  • WIFI 信道 channel

    5GHz 信道划分 国内室内AP可用36 40 44 48 52 56 60 64 149 153 157 161 165等13个信道 2 4GHz 共有14个信道 国内可用1 13信道 不干扰的仅1 6 11
  • Linux多线程

    全文目录 线程概念 线程缺点 线程的如何看待进程内部的资源 进程vs线程 线程控制 pthread库 pthread t 线程创建 线程等待 线程分离 线程退出 总结 线程互斥 互斥量接口 互斥量实现原理 总结 线程安全与可重入 常见的线程
  • CMake应用:基础篇

    CMake是一个开源 跨平台的编译 测试和打包工具 它使用比较简单的语言描述编译 安装的过程 输出Makefile或者project文件 再去执行构建 在使用IDE开发软件的过程中 代码的编译和构建一般是使用IDE自带的编译工具和环境进行编