CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)
一、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工程从入门到进阶完整版,可以完成简单的工程创建(完结)相关推荐
- mysql视频下载_Mysql基础+进阶完整版视频教程下载
Mysql基础+进阶完整版视频教程下载 课程介绍: Mysql是一个最常用的关系型数据库管理系统,此为python开发职业课程系列的其中一套课程.该套课程是现目前国内最齐全的mysql视频教程之一,从 ...
- python入门必备指南-致Python初学者 Anaconda入门使用指南完整版
打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...
- python编程入门指南 代码库在哪下-致Python初学者 Anaconda入门使用指南完整版
打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...
- python从入门到精通pdf-跟老齐学Python从入门到精通完整版PDF_Python教程
资源名称:跟老齐学Python 从入门到精通 完整版PDF 第1季 基础 第0章 预备 2 0.1 关于Python的故事 2 0.1.1 Python的昨天.今天和明天 3 0.1.2 Python ...
- python人门指南小说-致Python初学者 Anaconda入门使用指南完整版
打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...
- 小学生c语言入门ppt,C语言入门至精完整版46759.ppt
C语言入门至精完整版46759 第10章 指针 C语言程序设计 第十章 指针 地址和指针的概念 变量的指针和指向变量的指针变量 数组与指针 字符串与指针 指向函数的指针 返回指针值的函数 指针数组和指 ...
- 最新QT从入门到实战完整版(07 对象树)
最新QT从入门到实战完整版(07 对象树) 一.07 对象树 来自 一.07 对象树 看到我们创建了一个按钮,然后并且让它显示到窗口中啊,那下边大家看一下我刚才创建的按钮啊.都写的是new啊,都写的是 ...
- 最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_)
最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_) 一.08.qt中的坐标系 二,09 信号和槽-点击按钮关闭窗口_ 来自 一.08.qt中的坐标系 二,09 信号 ...
- qt学习笔记 来自B站【最新QT从入门到实战完整版|传智教育】
最新QT从入门到实战完整版|传智教育 目录在这里 2022.2.4 day1 06 QPushButton创建 07 对象树 08 Qt的坐标系 09 信号和槽-点击按钮关闭窗口 10 自定义信号和槽 ...
- 视频教程-Linux下Shell从入门到精通完整版-Linux
Linux下Shell从入门到精通完整版 京东商城运维架构师,京峰Linux云计算教学总监,担任国内多家知名社区运维专家网站Linux版主,专注Linux自动化运维,熟练LVS.Nginx,前端架构及 ...
最新文章
- 后深度学习时代的一大研究热点?论因果关系及其构建思路
- Node.js基金会官方的开发者认证准备就绪
- win 2008 控制共享文件夹大小_win10如何一键网络共享
- 深入浅出让你理解什么是LLVM
- 人脸识别方法个人见解
- 为什么美国财媒IBD力推网易为第1强股?
- 一本flash和搜索引擎交互的新书
- PAT(乙级) 1001 害死人不偿命的(3n+1)猜想 C++
- c++ socket学习(1.2)
- python的reshape方法_numpy库reshape用法详解
- 等待线程3秒返回结果_Excel小白超级讨厌的计算,原来只用3秒就能出结果!
- 匹配区县代码_行政区划代码查询
- 普及一下行业尖端知识——腾讯自研分布式数据库TBase
- PDM系统服务器管理,PDM产品数据管理系统
- 国家计算机考试培训心得,最新计算机培训心得总结5篇
- 支持ECSHOP 2.73手机客户端
- 千锋教育网络安全课程笔记
- R语言丨根据VCF文件自动填充对其变异位点并生成序列fa文件
- 生物信息学基础知识Day2
- uboot中LCD驱动修改
热门文章
- OPTEE学习笔记 - IPC
- android tee os,有关OP-TEE - 中文社区论区 - 中文社区 - Arm Community
- Vue搭脚手架及创建项目
- OpenCV图像阈值:简单阈值、自适应阈值、OTSU、TRIANGLE
- 程序、算法和数据结构的关系
- 计算机管理内存条,win10系统查看电脑内存条型号的方法
- NoClassDefFoundError: Could not initialize class org.apache.kafka.common.record.Compressio
- mysql查询成绩表中课程编号升序_数据库的常见题型--------------(查询)
- mac 连接android手机调试,mac连接华为手机,无法真机调试。
- 怎么看计算机配件型号,操作方法:如何查看CPU型号,教您如何通过CPU型号[图形]识别计算机的性能...