CMAKE工具语法解释
Posted 森明帮大于黑虎帮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMAKE工具语法解释相关的知识,希望对你有一定的参考价值。
一、CMake基础
1.CMake 是什么:
-
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。
-
Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
-
CMake是一个支持生成跨平台建构文件的工具。
-
CMake并不直接建构最终的软件,而是描述项目文件被编译的过程,生成标准的建构档(如 Unix 的 Makefile 或 VS 的 projects/workspaces),然后再以对应平台的建构方式使用。
2.CMake源文件:
- CMake编写的源⽂件以CMakeLists.txt 命名或以.cmake为扩展名。
- CMake的源⽂件包括 命令和注释。
- CMake源文件中所有有效的语句都是命令,可以是内置命令或者自定义的函数(function) 或 宏命令(macro)。
- 可以通过add_subdirectory()命令把子录的CMake源文件添加进来。
3.CMake编译C/C++原理:
-
CMake比Unix的make更为高级,使用起来要方便得多。
-
终端cmake命令将CMakeLists.txt文件建构为make所需要的makefile文件,
最后用make命令编译源码生成可执行程序或共享库(so(shared object))
因此CMake在Linux终端执行步骤总的来说就两个:
1.cmake
2.make -
终端执行cmake后会生成很多编译中间文件以及makefile文件,一般会新建一个build目录专门用来编译:
1.mkdir build
2.cd build
3.cmake . .
4.makebuild的创建也可以在CMakeLists.txt中使用命令创建。 cmake指向CMakeLists.txt所在的目录, cmake .. 表示当前CMakeLists.txt目录的上一级目录 然后进行工程的实际构建,使用 make 命令进行编译。
你会发现,系统自动生成了:CMakeFiles, CMakeCache.txt, cmake_install.cmake 等文件,并且生成了Makefile。现在不需要理会这些文件的作用,以后你也可以不去理会。最关键的是,它自动生成了Makefile。
然后进行工程的实际构建,在这个目录输入make 命令。对于一个庞大的工程,编写Makefile相当复杂, 有了CMake工具之后就可以读入所有源文件,自动生成Makefile等构建文件。
二、内部构建和外部构建
通俗一点,内部构建就是在项目内部,有CMakeList.txt
的地方,直接cmake .
,比如我们前面讲的简单案例都是最简单的内部构建. 结果你也看见了,就是在项目下面生成了很多的临时文件。
外部构建就是不直接在项目下面运行cmake
, 而是自己建立一个接受cmake
之后的临时文件的文件夹,然后再该文件夹下面调用cmake <CMakeList_path>
来构建。运行 make
构建工程,就会在当前目录(build 目录)
中获得目标文件 。上述过程就是所谓的out-of-source外部编译
,一个最大的好处是,对于原有的工程没有任何影响,所有动作全部发生在编译目录。
有编译过OpenCV
或者其他类似项目的童鞋,都应该知道,编译OpenCV的时候,我们常常自己建立一个build
目录,然后在该目录下面运行cmake,
最终临时文件就会在这个目录下面生成。
这里代码结构和CMakeList.txt都和第一个最简单的是差不多的。但是这里有一个不同,就是在里面建立了一个build
文件夹.然后再build
文件夹里面运行cmake ..
,结果就是之前的临时文件都存放在了这个build文件夹里面,同时在这个文件夹里面直接make可以得到最终的可执行文件。
到了这里,结合CMakeList.txt
文件中每个命令语句和生成执行文件的详细步骤。你应该对于cmake的运作过程有了一个基本的了解.、。当然这并不等于全部,有了这些基础,后面慢慢介绍更多更加常用的用法。
三、理解cmake --build . 这句话
简单说一下cmake项目构建过程:
- 首先,使用命令行:‘cmake ’,比如:
cmake .. ,
在你的构建目录(外部构建方式)下生成了项目文件project files。
官方文档中又叫build tree/binary tree,这其中就包括,比如:Makefile,还有一些其他相关文件/目录/子目录。 - 其次,自然是对生成好的项目(project files)进行编译构建,使用到的就是你说的’
cmake --build .
’ 。 - 最后,–build后面的那个‘.’,指的是生成好的build tree的路径。
一般来说,如果你明确知道,你的系统中使用的是哪种构建器(build generator), 比如:Unix Makefiles,你完全可以直接使用make进行项目构建. 。对于这种–build的形式,多用于自动化脚本之中,或者IDE环境下.
注: < source tree> 指的是源文件+顶层CMakeLists所在的路径,cmake ..
假设了路径在上一层。
cmake --build .
和cmake ../cmake ./make
有什么区别。
通过cmake ./cmake ..
命令创建Makefile文件后,一般使用make命令编译文件。这里的cmake --build .
就与make
一样的效果。另外,还有cmake --build . --target xxx这个命令
。如果xxx用help替换,可以看到xxx可以替换若干选项。例如cmake --build . --target all/ cmake --build . --target clean
等。而是使用 cmake --build .
形式的命令,主要是为了跨平台,使用这种形式后,不管你是使用的什么生成器,CMake
都能正确构建,否则如果使用的是 Ninja 或者其他生成器,那 make 就不生效了。
它允许cmake支持不同的底层,比如Makefile系列、Ninja系列等。例如要产生Ninja,加上 -G Ninja 即可:
cmake -G Ninja
如果没有 cmake --build .
这条命令,就需要调用底层命令,比如make或者ninja。但现在cmake提供了一个统一的命令接口,不管底层是啥,直接--build
即可。
就是说调用cmake程序。然后运行参数是“--build
”。
以上是关于CMAKE工具语法解释的主要内容,如果未能解决你的问题,请参考以下文章
CLion开发环境的完全解析(QT开发?STM32?顺便速通cmake