如何入门CMake
导论:
为啥我会分享这个呢?因为我发现如果直接看b站上的一些学习视频,可能会听不懂视频在讲什么?反正我是挺蒙的,所以我就浅浅的分享一下我如何入门Cmake,希望能给大家带来帮助。
1.什么是CMake?
学习一个东西肯定首先得知道他是啥,也就是它的定义。
CMake(英文 Cross platform Make 的缩写)它不是构建系统,而是构建系统生成器,属于一个跨平台构建工具,在 Linux 平台生成构建系统 make 的 Makefile 文件,在 Windows 平台生成 Visual Studio 或 MSVC 的工程等。所以具体的构建工作还是需要交给例如 Make,Ninja,MSVC 等这些构建系统去执行。(读到这里我还是很蒙哈,于是我还找到一个比较好理解的解释)
cmake的定义是什么 ?-----⾼级编译配置⼯具 cmake就是将多个cpp、hpp文件组合构建为一个大工程的语言。他能够输出各种各样的makefile或者project文件,所有操作都是通过编译CMakeLists.txt来完成。
知识补充(官方解释学术性都比较强哈,我这里尽量都用通俗易懂的语言去介绍)
- 什么是MSVC?
MSVC就是微软的C++编译器,就像炒菜用的锅和铲子一样。通过MSVC,你可以编写C++代码,并且它会帮你把这些代码变成可以在计算机上运行的程序。MSVC是一种可视化编程系统,就像搭积木一样,你可以通过拖拽和放置图形化的代码块来编写程序,这使得编程变得更加简单易懂。
- 什么是Ninja?
Ninja是一个让程序员更快编译代码的工具。它可以帮助程序员自动化一些任务,比如编译和链接代码,生成文件等。使用Ninja可以使构建过程更简单,更容易管理代码的构建和发布。
- 什么是hpp文件?
.hpp文件是C++程序头文件,通常用来定义数据类型、声明变量、函数、结构和类。与.h类似,但一般.h里面只有声明,没有实现,而.hpp里声明和实现都有,可以减少.cpp的数量。此外,系统会报错说找不到该文件的情况一般是.hpp的路径写错或者没有保存成功。
- 什么是makefile?(必讲)
Makefile就像是一个厨师的食谱,它可以帮助你自动化地编译你的代码。你可以把它想象成是一个列表,上面写着需要先准备哪些食材(源文件),然后怎么烹饪(编译)它们,以及哪些食材需要先准备(源文件的依赖关系)。当你需要编译你的菜肴(可执行文件)时,只需要翻开食谱(Makefile),找到对应的步骤,然后开始烹饪。如果有些食材(源文件)被改变了,Makefile可以帮你自动更新菜谱,你只需要重新烹饪(重新编译)被改变的部分,而不需要从头开始。这样你就可以更高效地完成你的烹饪任务了。
- 什么是project文件?
.project文件就像是项目的“身份证”。它告诉Eclipse这个项目是谁(名字、注释),它在哪里(目录结构、源代码位置),它是怎么构建的(构建方式、依赖关系),以及它有什么特殊要求(自定义构建脚本或命令)。Eclipse需要这个文件来知道如何正确地构建和运行项目。所以,当你创建或导入一个项目时,Eclipse会自动生成或更新.project文件,确保它能正确地描述和理解你的项目。
- 什么是Eclipse?
Eclipse是一个可以安装不同插件的Java开发工具。它就像一个可以自由定制的乐高积木,你可以根据自己的需要添加不同的插件来支持不同的编程语言。除了Java,你还可以用它来开发其他类型的软件,比如Python和C++等。Eclipse是一个非常灵活的开发工具,可以根据你的需要进行定制,使你的编程工作更加高效。
- 什么是CMakeLists.txt?(必讲)
CMakeLists.txt 是 CMake 用来描述项目构建规则和过程的重要文件。它就像是一份构建指令清单,告诉 CMake 如何编译和链接代码。在 CMakeLists.txt 中,我们可以设置项目名称、指定需要编译的源文件、添加库文件依赖等等。CMake 会读取这个文件并生成对应的编译文件,指导整个构建过程。编写 CMakeLists.txt 可以让跨平台编译变得更加简单方便。
2.我们需要学些什么?
对于入门CMake,我们需要学习两部分内容,分别为CMake的控制命令以及CMakeLists.txt的编写语法
在学习这两部分内容之前,我们需要先安装CMake,一般Linux操作系统是自带CMake的,如果用Windows系统,去下载地址安装。我这里用的虚拟机,虚拟机安装教程。很离谱的是,这个并没有自带cmake,你可以通过命令sudo apt install cmake来安装cmake。
- CMake基础语法介绍
PROJEC关键字
可以用来指定工程的名字和支持的语言,默认支持所有语言
PROJECT(HELLO)指定了工程的名字,并且支持所有语言(大力推荐)
PROJECT(HELLO CXX)指定了工程的名字,并且支持的语言是c++
PROJECT(HELLO C CXX)指定了工程的名字,并且支持的语言是c和c++
该指定隐式定义了两个CMAKE的变量
工程名字_BINARY_DIR(dir,目录)
工程名字_SOURCE_DIR
MESSAGE关键字就可以直接使用这两个变量,当前都指向当前的工作目录,后面会讲外部编译
补充:CMake 支持两种构建模式,分别为 in-source build(源码中构建),out-of-source build(源码外构建)
问题:如果改了工程名,这两个变量名也会改变
解决方法:又定义两个预定义变量:PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR,这两个变量和HELLO_BINARY_DIR,HELLO_SOURCE_DIR是一致的
SET关键字
用于设置变量的值。这个变量可以为普通变量,缓冲变量或者是环境变量。
SET(<variable> <value>... [PARENT_SCOPE]) #设置普通变量
SET(<variable> <value>... CACHE <type> <docstring> [FORCE]) #设置缓存变量
SET(ENV{<variable>} [<value>]) #设置环境变量
MESSAGE关键字
向终端输出用户自定义的信息(个人感觉类似于c语言中printf())
主要包含三种信息:
SEND_ERROR,产生错误,生成过程被跳过。
STATUS,输出前缀为-的信息。(status,状态)T
FATAL_ERROR,立即终止所有cmake过程。(fatal,重大的)
ADD_EXECUTABLE关键字
生成一个可执行文件(executable,可执行的)
ADD_EXECUTABLE(hello ${SRC_LIST})
在这行代码中,hello是生成可执行文件的文件名,文件的内容取的变量SRC_LIST的内容
- 语法的基本原则
1.变量使用${}方式取值,但是在IF控制语句中是直接使用变量名。
2.指令(参数1 参数2…)参数使用括弧括起,参数之间用空格或者分号隔开。以上面的ADD_EXECUTABLE指令为例,如果存在另外一个func.cpp源文件,就要写成:ADD_EXECUTABLE(hello main.cpp func.cpp)或者ADD_EXECUTABLE(hello main.cpp;func.cpp)。
3.指令大小写都可以,参数和变量要严格区分。为了方便别人看你的代码,你自己看着也舒服,推荐指令全部是用大写。
语法注意事项
1.SET(SRC_LIST main.cpp)可以写成SET(SRC_LIST "main.cpp"),如果源文件中有空格,就必须要加双引号。
2.ADD_EXECUTABLE(hello main)后缀可以不写,它会自动去找.c和.cpp,但最好别这样写,稍微想一想就知道为啥,不做赘述。
写至此处,我想了想,我要做的只是分享如何入门,大部分的东西还是需要靠你们自己去学我感觉这样比较好(没有任何其他的意思),因为上面讲到的知识已经足够让你看懂视频了。)