一、Cmake介绍

CMake是一个跨平台的编译工具,使用CMake能够输出各种各样的makefile或者project文件。
先介绍makefile:以一个linux下的例子来说,我要编译如图所示的工程怎么办?

如果不用make命令,则应当输入的命令为:

gcc命令输入那么多次,如果我的文件有100个,输入就会烦死。
引入Makefile:只执行make即可生成可执行文件out,如图:

Makefile的内容为:

Makefile生成也很麻烦啊,如果我要是添加一个文件,上图的每行都要修改。于是Makefile有变量解决这个问题,如图所示:

如果添加文件,直接修改第1~3行即可。
还是麻烦?有自动生成makefile文件的工具,即Autotools,可是这个玩意很恶心,用起来特别难用。
于是,引入CMake:Cmake的原理,如图所示的工程文件目录可以看到,每层文件目录下都有文件CMakeLists.txt的文件。Cmake就是通过这样的文件配置,一层层配置寻找CMakeLists.txt完成整个文件的编译工作的。如图所示的CMake文件,他展示了Cmake的工程框架。

先编译下Cmake工程文件:
Linux端:
mkdir build # 创建build目录
cd build # 进入build目录
cmake … # 因为程序入口构建文件在项目根目录下,采用相对路径上级目录来使用根目录下的构建文件

编译结果:自动生成Makefile如图画圆圈的地方,这时直接执行make命令即可自动编译。(画对号的为生成的库和可执行文件)

makefile自动生成了,很开心!!

二、Cmake语法介绍

本教程的cmake工程demo链接:
https://github.com/Sunny1314163/Cmake_demo.git
cmake_learn_old这个文件夹是 Cmake语法介绍里面的内容,是个基本的demo
cmake_learn_new这个文件夹是 Cmake语法进阶里面的内容,是个进阶版的demo
这两个版本都能做基本的cmake工程,建议用cmake_learn_new这个demo,因为这个目前最方便用。

先介绍顶层和下一层的这个CMakefileLists.txt,这两个只包含文件夹路径:

解释一下:上图红圈1和2的内容
1的内容:
cmake_minimum_required(VERSION 3.20) #cmake最小的版本是3.20,小于这个版本不会编译
project( cmake_tutorial ) #工程名称为cmake_tutorial
add_subdirectory( samples )#去下级目录samples下面寻找CMakefileLists.txt文件
2的内容同理。

再往下一层的文件夹0.mian 里面CMakefileLists.txt文件,如图所示:
源文件:

解释下:
set( src #自己定义的变量,定义一个变量,存放源文件路径
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/lib.cpp
)
CMAKE_CURRENT_SOURCE_DIR 内置变量,表示当前CMakefileLists.txt的路径

工程里面不能.c文件和.h文件都散列出来,所以把.c和.h放到文件夹里面管理。如果源文件路径包含文件夹如图所示,把文件放到各自的文件夹里面管理,那写法就如图所示,添加文件路径,下划线:


头文件

那头文件怎么办?头文件是如下图所示的写法,如图所示Main.c 里面include 两个头文件
ex_lib.h是外部库的路径,lib.h本地头文件的路径,那应该写成:

include_directories( #代码中include头文件的路径
${CMAKE_SOURCE_DIR}/samples/ex.lib # 外部库的路径
${CMAKE_CURRENT_SOURCE_DIR}/inc #本路径下的头文件路径
)
CMAKE_SOURCE_DIR : 定义顶级CMakeLists.txt的文件夹路径

可执行文件
源文件编译,库文件、头文件都找到并链接后,编译生成可执行文件,写法如下所示。
add_executable( main #可执行文件的名称为 main
${src} #main源文件路径
)

库文件
库文件 ex.lib是外部库文件,他被main.cpp里面引用到,因此编译外部库文件的写法为:
set( src #外部库的源文件
${CMAKE_CURRENT_SOURCE_DIR}/ex_lib.cpp
)
add_library (ex_lib STATIC #STATIC是静态库,SHARED是动态库
${src}
)

到此CMmake基本的用法讲解完了,这样就可以通过CMake进行工程的开发和创建了,但是CMake还有更好用的方法,请看下一章,CMake进阶。
PS:需要打开cmake_learn_new这个文件夹查看。

三、Cmake语法进阶

target 的引入:
Set的语法已经过时,引入target可以增加Cmake更多好用的功能。
Set() 改写在了target_sources()里面,表示可执行文件main的目标文件,如图所示的改写。
target_sources()

为什么外部库的引用注释掉了?因为当你不知道外部库的路径的时候,又不想问,Cmake就很贴心的给你准备了这个功能,只要知道库文件的名字,就可以调用。需要修改下如图所示的函数
target_link_libraries() 这个函数可以根据库名字去寻找库文件。这target的优势就很明显了,他会自动给你找到外部库文件的地方。

target_link_libraries()

target_include_directories()

既然target_link_libraries()外部库可以根据库名字自动去寻找库函数,那库函数的生成就也有特定的规则。
在生成库函数的时候需要改写成如下的格式才能被调用到,如图:
target_include_directories(ex_lib
INTERFACE #表示有人需要调用这个库文件
)

PRIVATE PUBLIC INTERFACE

在target系列函数里面都会有PRIVATE PUBLIC INTERFACE的身影。
解释下这三个宏:
PRIVATE:表示PRIVATE下面的源文件和库都会给target自己使用。比如:
target_sources(main #这里的target为main,有PERIVATE标志
PRIVATE #这些源文件只会生成到main中,别人不能用
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/lib.cpp
)
INTERFACE:表示INTERFACE生成的库会有人调用,自己不会调用,比如:ex_lib即是生成的别的模块可以调用的库函数
target_include_directories(ex_lib
INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}
)。
PUBLIC = INTERFACE + PRIVATE 表示即可以自己用,别人也可以调用。

至此,target系列的函数也讲清楚了,不用再去看别人写的看不懂又高大上的target系列函数的讲解,反正我看了是一头的雾水。

四、总结

CMake当然不只有这些用法,还有很多,一旦入了门,那就可以直接自己去研究官网的函数规则。当你仔细看完这个教程,就可以用来做工程项目,完成项目的需求。
如果你是一个Cmake小白,那就把源工程下载下来,根据提供的源文件去看这个教程,你一定会有收获,这比你去寻找网上支离破碎的教程强多了。这篇教程可以让你系统的掌握Cmake的用法,举一反三。
Cmake官网:
https://cmake.org/cmake/help/v3.22/manual/cmake-buildsystem.7.html
若有问题,欢迎私信。

CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)相关推荐

  1. mysql视频下载_Mysql基础+进阶完整版视频教程下载

    Mysql基础+进阶完整版视频教程下载 课程介绍: Mysql是一个最常用的关系型数据库管理系统,此为python开发职业课程系列的其中一套课程.该套课程是现目前国内最齐全的mysql视频教程之一,从 ...

  2. python入门必备指南-致Python初学者 Anaconda入门使用指南完整版

    打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...

  3. python编程入门指南 代码库在哪下-致Python初学者 Anaconda入门使用指南完整版

    打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...

  4. python从入门到精通pdf-跟老齐学Python从入门到精通完整版PDF_Python教程

    资源名称:跟老齐学Python 从入门到精通 完整版PDF 第1季 基础 第0章 预备 2 0.1 关于Python的故事 2 0.1.1 Python的昨天.今天和明天 3 0.1.2 Python ...

  5. python人门指南小说-致Python初学者 Anaconda入门使用指南完整版

    打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...

  6. 小学生c语言入门ppt,C语言入门至精完整版46759.ppt

    C语言入门至精完整版46759 第10章 指针 C语言程序设计 第十章 指针 地址和指针的概念 变量的指针和指向变量的指针变量 数组与指针 字符串与指针 指向函数的指针 返回指针值的函数 指针数组和指 ...

  7. 最新QT从入门到实战完整版(07 对象树)

    最新QT从入门到实战完整版(07 对象树) 一.07 对象树 来自 一.07 对象树 看到我们创建了一个按钮,然后并且让它显示到窗口中啊,那下边大家看一下我刚才创建的按钮啊.都写的是new啊,都写的是 ...

  8. 最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_)

    最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_) 一.08.qt中的坐标系 二,09 信号和槽-点击按钮关闭窗口_ 来自 一.08.qt中的坐标系 二,09 信号 ...

  9. qt学习笔记 来自B站【最新QT从入门到实战完整版|传智教育】

    最新QT从入门到实战完整版|传智教育 目录在这里 2022.2.4 day1 06 QPushButton创建 07 对象树 08 Qt的坐标系 09 信号和槽-点击按钮关闭窗口 10 自定义信号和槽 ...

  10. 视频教程-Linux下Shell从入门到精通完整版-Linux

    Linux下Shell从入门到精通完整版 京东商城运维架构师,京峰Linux云计算教学总监,担任国内多家知名社区运维专家网站Linux版主,专注Linux自动化运维,熟练LVS.Nginx,前端架构及 ...

最新文章

  1. 后深度学习时代的一大研究热点?论因果关系及其构建思路
  2. Node.js基金会官方的开发者认证准备就绪
  3. win 2008 控制共享文件夹大小_win10如何一键网络共享
  4. 深入浅出让你理解什么是LLVM
  5. 人脸识别方法个人见解
  6. 为什么美国财媒IBD力推网易为第1强股?
  7. 一本flash和搜索引擎交互的新书
  8. PAT(乙级) 1001 害死人不偿命的(3n+1)猜想 C++
  9. c++ socket学习(1.2)
  10. python的reshape方法_numpy库reshape用法详解
  11. 等待线程3秒返回结果_Excel小白超级讨厌的计算,原来只用3秒就能出结果!
  12. 匹配区县代码_行政区划代码查询
  13. 普及一下行业尖端知识——腾讯自研分布式数据库TBase
  14. PDM系统服务器管理,PDM产品数据管理系统
  15. 国家计算机考试培训心得,最新计算机培训心得总结5篇
  16. 支持ECSHOP 2.73手机客户端
  17. 千锋教育网络安全课程笔记
  18. R语言丨根据VCF文件自动填充对其变异位点并生成序列fa文件
  19. 生物信息学基础知识Day2
  20. uboot中LCD驱动修改

热门文章

  1. OPTEE学习笔记 - IPC
  2. android tee os,有关OP-TEE - 中文社区论区 - 中文社区 - Arm Community
  3. Vue搭脚手架及创建项目
  4. OpenCV图像阈值:简单阈值、自适应阈值、OTSU、TRIANGLE
  5. 程序、算法和数据结构的关系
  6. 计算机管理内存条,win10系统查看电脑内存条型号的方法
  7. NoClassDefFoundError: Could not initialize class org.apache.kafka.common.record.Compressio
  8. mysql查询成绩表中课程编号升序_数据库的常见题型--------------(查询)
  9. mac 连接android手机调试,mac连接华为手机,无法真机调试。
  10. 怎么看计算机配件型号,操作方法:如何查看CPU型号,教您如何通过CPU型号[图形]识别计算机的性能...