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

一、Cmake介绍


CMake是一个跨平台的编译工具,使用CMake能够输出各种各样的makefile或者project文件。
先介绍makefile:以一个linux下的例子来说,我要编译如图所示的工程怎么办?
在这里插入图片描述
如果不用make命令,则应当输入的命令为:
在这里插入图片描述
gcc命令输入那么多次,如果我的文件有100个,输入就会烦死。
引入Makefile:只执行make即可生成可执行文件out,如图:
在这里插入图片描述
Makefile的内容为:
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第1张图片
Makefile生成也很麻烦啊,如果我要是添加一个文件,上图的每行都要修改。于是Makefile有变量解决这个问题,如图所示:
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第2张图片
如果添加文件,直接修改第1~3行即可。
还是麻烦?有自动生成makefile文件的工具,即Autotools,可是这个玩意很恶心,用起来特别难用。
于是,引入CMake:Cmake的原理,如图所示的工程文件目录可以看到,每层文件目录下都有文件CMakeLists.txt的文件。Cmake就是通过这样的文件配置,一层层配置寻找CMakeLists.txt完成整个文件的编译工作的。如图所示的CMake文件,他展示了Cmake的工程框架。
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第3张图片
先编译下Cmake工程文件:
Linux端:
mkdir build # 创建build目录
cd build # 进入build目录
cmake … # 因为程序入口构建文件在项目根目录下,采用相对路径上级目录来使用根目录下的构建文件

编译结果:自动生成Makefile如图画圆圈的地方,这时直接执行make命令即可自动编译。(画对号的为生成的库和可执行文件)
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第4张图片
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,这两个只包含文件夹路径:
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第5张图片
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第6张图片

CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第7张图片

解释一下:上图红圈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文件,如图所示:
源文件:
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第8张图片
解释下:
set( src #自己定义的变量,定义一个变量,存放源文件路径
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/lib.cpp
)
CMAKE_CURRENT_SOURCE_DIR 内置变量,表示当前CMakefileLists.txt的路径

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

CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第9张图片
头文件

那头文件怎么办?头文件是如下图所示的写法,如图所示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的文件夹路径
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第10张图片
可执行文件
源文件编译,库文件、头文件都找到并链接后,编译生成可执行文件,写法如下所示。
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}
)
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第11张图片
到此CMmake基本的用法讲解完了,这样就可以通过CMake进行工程的开发和创建了,但是CMake还有更好用的方法,请看下一章,CMake进阶。
PS:需要打开cmake_learn_new这个文件夹查看。

三、Cmake语法进阶


target 的引入:
Set的语法已经过时,引入target可以增加Cmake更多好用的功能。
Set() 改写在了target_sources()里面,表示可执行文件main的目标文件,如图所示的改写。
target_sources()
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第12张图片
为什么外部库的引用注释掉了?因为当你不知道外部库的路径的时候,又不想问,Cmake就很贴心的给你准备了这个功能,只要知道库文件的名字,就可以调用。需要修改下如图所示的函数
target_link_libraries() 这个函数可以根据库名字去寻找库文件。这target的优势就很明显了,他会自动给你找到外部库文件的地方。

target_link_libraries()
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第13张图片
target_include_directories()

既然target_link_libraries()外部库可以根据库名字自动去寻找库函数,那库函数的生成就也有特定的规则。
在生成库函数的时候需要改写成如下的格式才能被调用到,如图:
target_include_directories(ex_lib
INTERFACE #表示有人需要调用这个库文件
)
CMake工程从入门到进阶完整版,可以完成简单的工程创建(完结)_第14张图片
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
若有问题,欢迎私信。

你可能感兴趣的:(教程,linux,CMake,target,gcc)