1 CMake 简明教程

CMake教程 CMake教程 CMake是一个构建系统,可以用于构建跨平台的C和C++项目。其它的构建系统有makefile、MSBuild以及qmake。 使用CMake作为C或C++的构建系统已经变得越来越流行了,例如: 在Jetbrains的C++ 编程 - 2020 开发人员生态系统信息图调查中,CMake是最流行的构建系统。 CMake是CLion的默认构建系统。 CMake是Qt6的默认构建系统,之前是qmake。 Visual Studio IDE将对CMake的支持添加到2020年规划的路线图中。 许多 阅读详情

原文地址:https://blog.youkuaiyun.com/whahu1989/article/details/82078563

原作写的很详细,如需要可以阅读原文,感谢原作者,本篇文章做了一些改动

 

一 安装CMake

本文使用ubuntu18.04,安装cmake使用如下命令,
sudo apt install cmake
安装完成后,在终端下输入cmake -version查看cmake版本,

这样cmake就安装好了。

 

二 简单样例

首先让我们从最简单的代码入手,先来体验下cmake是如何操作的。编写main.c,如下,

#include <stdio.h>

int main(void)

{

    printf("Hello World\n");

 

    return 0;

}

然后在main.c相同目录下编写CMakeLists.txt,内容如下,

cmake_minimum_required(VERSION 2.8)

project(demo)

add_executable(main main.c)

第一行意思是表示cmake的最低版本要求是2.8,我们安装的是3.10.2;

第二行是表示本工程信息,也就是工程名叫demo;

第三行比较关键,表示最终要生成的elf文件的名字叫main,使用的源文件是main.c
在终端下切到main.c所在的目录下,然后输入以下命令运行cmake,
cmake .
可以看到成功生成了Makefile,还有一些cmake运行时自动生成的文件。
然后在终端下输入make并回车,

make
可以看到我们需要的elf文件main也成功生成了,然后运行main,
./main
运行成功!

PS: 如果想重新生成main,输入make clean就可以删除main这个elf文件。

 

三 同一目录下多个源文件

接下来进入稍微复杂的例子:在同一个目录下有多个源文件。
在之前的目录下添加2个文件,testFunc.c和testFunc.h。添加完后整体文件结构如下,

修改CMakeLists.txt,在add_executable的参数里把testFunc.c加进来

cmake_minimum_required(VERSION 2.8)

 

project(demo)

add_executable(main main.c testFunc.c)

重新执行cmake生成Makefile并运行make,

 

如下命令可以把指定目录下所有的源文件存储在一个变量中,这个命令就是 aux_source_directory(dir var)。
第一个参数dir是指定目录,第二个参数var是用于存放源文件列表的变量。

 

我们在main.c所在目录下再添加2个文件,testFunc1.c和testFunc1.h。添加完后整体文件结构如下,

修改CMakeLists.txt,

cmake_minimum_required (VERSION 2.8)

 

project (demo)

 

aux_source_directory(. SRC_LIST)

 

add_executable(main ${SRC_LIST})

aux_source_directory把当前目录下的源文件存列表存放到变量SRC_LIST里,然后在add_executable里调用SRC_LIST(注意调用变量时的写法)。
再次执行cmake和make,并运行main,
可以看到运行成功了。

 

四 不同目录下多个源文件

我们把之前的源文件整理一下(新建2个目录test_func和test_func1),整理好后整体文件结构如下,

其中,CMakeLists.txt和main.c在同一目录下,内容修改成如下所示,

cmake_minimum_required (VERSION 2.8)

 

project (demo)

include_directories (test_func test_func1)

aux_source_directory (test_func SRC_LIST)

aux_source_directory (test_func1 SRC_LIST1)

add_executable (main main.c ${SRC_LIST} ${SRC_LIST1})

include_directories:用来向工程添加多个指定头文件的搜索路径,多个路径用空格分隔。

如下:

main.c直接直接引用头文件

#include "testFunc.h"

#include "testFunc.c"

如不使用,则需在main.c里使用include来指定路径,如下

#include "test_func/testFunc.h" 

#include "test_func1/testFunc1.h"

 

 

五 正规一点的组织结构

正规一点来说,

源文件放到src目录下

头文件放入到include文件下

生成的对象文件放入到build目录下

最终输出的elf文件会放到bin目录下

这样整个结构更加清晰。让我们把前面的文件再次重新组织下,

我们在最外层目录下新建一个CMakeLists.txt,内容如下,

cmake_minimum_required (VERSION 2.8)

 

project (demo)

 

add_subdirectory (src)

add_subdirectory():这个命令可以向当前工程添加存放源文件的子目录,当执行cmake时,就会进入src目录下去找src目录下的CMakeLists.txt

 

在src目录下也建立一个CMakeLists.txt,内容如下,

aux_source_directory (. SRC_LIST)

 

include_directories (../include)

 

add_executable (main ${SRC_LIST})

 

set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

set():是用于定义变量的,EXECUTABLE_OUT_PATH和PROJECT_SOURCE_DIR是CMake自带的预定义变量,其意义如下,

  • EXECUTABLE_OUTPUT_PATH :生成的目标文件的存放位置
  • PROJECT_SOURCE_DIR:工程的根目录

 

添加好以上这2个CMakeLists.txt后,整体文件结构如下,

下面来运行cmake,不过这次先让我们切到build目录下,然后输入以下命令,
cmake ..
Makefile会在build目录下生成,然后在build目录下运行make,

这里解释一下为什么在build目录下运行cmake?从前面几个case中可以看到,如果不这样做,cmake运行时生成的附带文件就会跟源码文件混在一起,这样会对程序的目录结构造成污染

 

六 动态库和静态库的编译控制

有时我们只需要编译出动态库,静态库,然后等着让其它程序去使用。

我们会在build目录下运行cmake,并把生成的库文件存放到lib目录下。

最外层的CMakeLists.txt内容如下,

cmake_minimum_required (VERSION 2.8)

 

project (demo)

 

add_subdirectory (lib_testFunc)

 

lib_testFunc目录下的CMakeLists.txt如下,

aux_source_directory (. SRC_LIST)

 

add_library (testFunc_shared SHARED ${SRC_LIST})

add_library (testFunc_static STATIC ${SRC_LIST})

 

set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")

set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")

 

set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

这里又出现了新的命令和预定义变量,

  • add_library: 生成动态库或静态库 (第1个参数指定库的名字;第2个参数决定是动态还是静态,如果没有就默认静态;第3个参数指定生成库的源文件)
  • set_target_properties: 设置输出的名称,还有其它功能,如设置库的版本号等等
  • LIBRARY_OUTPUT_PATH: 库文件的默认输出路径,这里设置为工程目录下的lib目录

 

七 对库进行链接

前面讲解生成库,现在进行库连接,整体结构如下

修改工程目录下的CMakeLists.txt,如下,

cmake_minimum_required (VERSION 2.8)

 

project (demo)

 

add_subdirectory (lib_testFunc)

 

add_subdirectory (src)


src目录下的CMakeLists.txt如下,

aux_source_directory (. SRC_LIST)

 

# find testFunc.h

include_directories (../lib_testFunc)

 

link_directories (${PROJECT_SOURCE_DIR}/lib)

 

add_executable (main ${SRC_LIST})

 

target_link_libraries (main testFunc)

 

set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

这里出现2个新的命令,

  • link_directories: 添加非标准的共享库搜索路径
  • target_link_libraries: 把目标文件与库文件进行链接

ps:target_link_libraries (main testFunc) 默认是使用动态库,如果lib目录下只有静态库,那么这种写法就会去链接静态库。也可以直接指定使用动态库还是静态库,写法是:target_link_libraries (main libtestFunc.so)或target_link_libraries (main libtestFunc.a)

ps: 查看elf文件使用了哪些库,可以使用readelf -d ./xx来查看

 

八 添加编译选项

有时编译程序时想添加一些编译选项,如-Wall,-std=c++11等,就可以使用add_compile_options来进行操作。

CMakeLists.txt内容如下,

cmake_minimum_required (VERSION 2.8)

 

project (demo)

 

set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

 

add_compile_options(-std=c++11 -Wall) 

 

add_executable(main main.cpp)

 

 

九 添加控制选项

有时希望在编译代码时只编译一些指定的源码,例如本来要编译生成多个bin或库文件,现在只想生成某些指定的bin或库文件,这时可以使用cmake的option命令。

这里仍然使用例子来解释,假设我们现在的工程会生成2个bin文件,main1和main2,现在整体结构体如下,

外层的CMakeLists.txt内容如下,

cmake_minimum_required(VERSION 2.8)

 

project(demo)

 

option(MYDEBUG "enable debug compilation" OFF)

 

set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

 

add_subdirectory(src)

这里使用了option命令,其第一个参数是这个option的名字,第二个参数是字符串,用来描述这个option是来干嘛的,第三个是option的值,ON或OFF,也可以不写,不写就是默认OFF。

然后编写src目录下的CMakeLists.txt,如下

cmake_minimum_required (VERSION 2.8)

 

add_executable(main1 main1.c)

 

if (MYDEBUG)

    add_executable(main2 main2.c)

else()

    message(STATUS "Currently is not in debug mode")    

endif()

注意,这里使用了if-else来根据option来决定是否编译main2.c
其中main1.c和main2.c的内容如下,

// main1.c#include <stdio.h>

int main(void){

    printf("hello, this main1\n");

    

return 0;

}

// main2.c#include <stdio.h>

int main(void){

    printf("hello, this main2\n");

    

return 0;

}

然后cd到build目录下输入cmake .. && make就可以只编译出main1,如果想编译出main2,就把MYDEBUG设置为ON,再次输入cmake .. && make重新编译。

每次想改变MYDEBUG时都需要去修改CMakeLists.txt,有点麻烦,其实可以通过cmake的命令行去操作,例如我们想把MYDEBUG设置为OFF,先cd到build目录,然后输入cmake .. -DMYDEBUG=ON,这样就可以编译出main1和main2 (在bin目录下)

CMake 教程(一)初识 CMake 要启动项目,我们使用project()命令来设置项目名称。每个项目都需要此调用,并且应在之后立即调用。正如我们稍后将看到的,此命令还可用于指定其他项目级别信息,例如语言或版本号。[VERBATIM] 阅读详情

相关推荐

Modern CMake 简明教程(1) - 初识 CMake

是一个开源、跨平台的构建系统生成器(Build-system Generator)。CMake 是构建系统生成器,而不是构建系统,CMake 支持生成不同构建系统所支持的工程文件,如 Visual Studio,XCode,Makefile 等。本教程作为 CMake 的简明教程,不会事无巨细的讲述 CMake 的每一个语法,而是以实用为目的,介绍 CMake 的基础语法和常用指令。

while(1) { smile(); } 1282

cmake使用详细教程(日常使用这一篇就足够了)

此时可以使用cmake中的函数存储这些源文件。只需要在CMakeLists.txt中添加所依赖的.cpp文件,编译步骤和上面相同。有时编译程序时想添加一些编译选项,如-Wall,-std=c++11等,可以使用。此时在当前目录新增两个依赖,并mian函数的执行需要依赖这两个文件。1、在官网下载cmake的安装包,这里我下载的是v3.26。4、此时已经安装完成,可以在shell中使用cmake命令。2、找到下载的sh文件,并使用bash来执行sh脚本。对于集中的头文件,CMake提供了一个很方便的函数。

iuu77的博客 20万+

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测_2026-02-26

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测作为一名编程小白,我目前正在学习编译和运行 Qt 框架,也在逐步摸索开发环境的配置方法,目标是打造一款属于自己的个人效率工具。就在这时,我挖到了一个国家级硬核福利:国家超算互联网核心节点开放免费试运行!哪怕是零基础如我,也能申领到 100 卡时异构加速卡算力,关键是——2 月底前申请更稳妥,早占位早使用。

qq_58517981的博客 2108

CMake常用命令(五)add_executable命令 生成可执行文件

使用指定的源文件来生成目标可执行文件。这里的目标可执行文件分为三类:==普通可执行目标文件==、==导入可执行目标文件==、==别名可执行目标文件==。分别对应上面的三种命令格式。

qq_26849933的博客 1万+

Frida实战:SSL Pinning绕过技术全解析

本文详细解析了如何使用Frida工具绕过SSL Pinning技术,包括环境搭建、四种实战绕过方案及常见问题排查指南。通过具体代码示例和实战经验,帮助安全研究人员快速掌握SSL Pinning绕过技术,适用于金融类App的安全测试场景。

weixin_42530732的博客 188

Jenkins插件下载慢?3分钟搞定国内镜像加速(含华为/腾讯/清华源对比)

本文详细介绍了如何通过国内镜像源加速Jenkins插件下载,包括华为云、腾讯云和清华源等主流镜像站的性能对比及一键配置方案。通过实测数据展示华为云镜像站表现最佳,下载速度达19.4MB/s,并提供sed命令、管理界面配置和Docker定制三种高效加速方案,帮助开发者快速解决插件下载慢的问题。

sql99的博客 320

cmake超详细入门教程,学不会你捶我~

我们在平时编译代码的时,面对简单的代码,直接GCC编译就好,稍微多一点,可以编写Makefile来编译,以上编译起来都很轻松,可是平时工作的时候基本都是大工程呀,代码文件少则几十个文件了,这种情况下就头疼了,咋办呢?今天我来教你使用cmake轻松解决问题~提示:以下是本篇文章正文内容,下面案例可供参考关于cmake的使用方法还有很多,这里只是做了一个最基本的介绍,后期有机会在进行详细补充~

十年饮冰,难凉热血,保持热爱,奔赴星海! 6万+

Synopsys安装教程Ubuntu22.04版本

在Ubuntu22版本上安装Synopsys等系列工具,安装DC,VCS等等

qq_59529218的博客 5727

CMake入门指南

CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者cte...

weixin_34302561的博客 6341

Python爬虫实战:公共资源交易平台招标数据采集实战 - 从零构建企业情报系统(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1288

从零搭建 C# + YOLO 工业视觉系统:从模型训练到上位机部署(工业级落地)

做工业质检、自动化生产线的同学都懂:一套能用的工业视觉系统,既要“检测准”,又要“界面易操作”,还要“部署稳”。之前帮某电子厂做PCB缺陷检测,一开始用Python+YOLO做检测核心,QT做上位机,结果踩了无数坑:Python推理速度波动大,QT和Python跨语言集成繁琐,数据传递容易卡顿;后来换成C# + YOLO的组合,直接打通了“模型训练-上位机开发-工业部署”全流程——C#的WinForms/WPF开发上位机高效,工业相机SDK支持完善;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 737

CMake中add_executable的使用

CMake中add_executable的使用

网络资源是无限的 1万+

飞书接入OpenClaw:从零到一的保姆级图文教程

本文主要介绍了飞书接入OpenClaw:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 解决方案 2.1 步骤一:安装插件 2.2 步骤二:创建机器人应用 2.3 步骤三:测试 3. 注意事项

weixin_43178406的博客 13万+

CMake 简明教程(1)---第一个例子

原文网址:http://cmake.org/cmake/help/cmake_tutorial.html 工作中总是免不了要使用cmake,这真是一个神

LaineGates的专栏 3783

华为OD新系统机试真题 2026.5.10 - 美观的灯笼

华为OD新系统机试真题【美观的灯笼】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【美观的灯笼】

qq_45776114的博客 643

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

现代 CMake 简明教程(一)- CMake 基础

系列文章目录 现代 CMake 简明教程(一) - CMake 基础 前言 用 CMake 来构建 C/C++ 项目是业内的主流做法。最近,我们的项目代码做了一些拆分和合并:引入其他仓库代码,并且将公共部分拆分以供多个仓库同时使用。为此,就得修改项目中的 CMake 以满足需求。 在做这件事情时,过程是相当痛苦的,修改的难度超过了我的预期。这份痛苦的回忆,让我陷入了沉思:这 CMake 咋这么不好使,是我的使用姿势不对吗?CMake 的最佳实践是啥? 在经过一番搜索和学习,我开始了解 Modern

记录学习的过程 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

CMake简明教程 笔记

CMake项目是基于CMakeLists.txt构建的,在CMakeLists.txt中(或者是*.cmake)我们用到的是CMake LanguageCMake Language的语法非常像一些命令式编程语言执行从源树(CMakeLists.txt)的根文件开始CMake命令行工具是由五个可执行文件构成cmakectestcpackcmake-guiccmake如果不通过CMakeLists.txt,运行CMake以上用法很少在项目中用到,但适合学习CMake语法jiko")

呵呵哒!的博客 1326

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基于Cmake+QT+VS的C++项目构建开发编译简明教程

目录 一、工具下载与安装 1. Qt 2. Visual Studio 2015 3. Cmake 二、C++及Qt项目构建 1. 基于VS构建Qt项目 2. 基于Qt Creater构建,在VS中使用 用Qt Creater构建项目 用VS开发Qt Creater生成的项目 3. 基于Cmake构建 用CMake-Gui构建 ...

weixin_30632089的博客 4942

Linux下CMake简明教程

Linux下使用CMake的教程

爱就是是恒久忍耐的专栏 18万+

Linux下CMake简明教程---自己学习使用

CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。本文主要讲述在Linux下如何使用CMake来编译我们的程序。

gygedg的博客 1306

cmake简明教程-半小时从入门到精通

参考文献:入门首先:http://www.hahack.com/codes/cmake/#官方教程:https://cmake.org/cmake-tutorial/官方教程译文:https://juejin.im/post/5a72775d6fb9a01cac187e96简单操作语法:https://learnxinyminutes.com/docs/cmake/官方cmake、ctest、cp...

qccz123456的博客 1万+

CMake使用教程

CMake简介CMake是一个跨平台的、开源的构建工具。cmake是makefile的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量.目前很多开源的项目都可以通过CMake工具来轻松构建工程,例如博客之前分享的openHMD、hidapi、OSVR-Core等等,代码的分享者提供源代码和相应的Cmake配置文件,使用者就可以非常方便的在自己的

3万+

CMake简明教程

Cmake简易教程,快速熟悉cmake

BigDavid123的博客 502

linux cmake 教程,CMake简明教程

阅读量:121为什么使用CMake实现C/C++编译的跨平台一致性无CMake时添加一个新源文件,需要在各个平台的工程文件里分别修改有CMake时添加一个新源文件,只需修改CMakeLists即可基本语法特性基本语法格式:指令(参数1 参数2)参数使用括弧括起参数之间使用空格或分号分开指令是大小写无关的add_executable(hello main.cpp hello.cpp)ADD_EXEC...

weixin_42360733的博客 716
上一篇: c++ Linux VSCode 环境搭建
下一篇: 2 CMake 语法与命令
dabusidede
博客等级 码龄9年 84粉丝 208原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值