CMAKE工具语法解释

一、CMake基础

1.CMake 是什么:

  1. CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。

  2. Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

  3. CMake是一个支持生成跨平台建构文件的工具。

  4. CMake并不直接建构最终的软件,而是描述项目文件被编译的过程,生成标准的建构档(如 Unix 的 Makefile 或 VS 的 projects/workspaces),然后再以对应平台的建构方式使用。

2.CMake源文件:

  1. CMake编写的源⽂件以CMakeLists.txt 命名或以.cmake为扩展名。
  2. CMake的源⽂件包括 命令和注释。
  3. CMake源文件中所有有效的语句都是命令,可以是内置命令或者自定义的函数(function) 或 宏命令(macro)。
  4. 可以通过add_subdirectory()命令把子录的CMake源文件添加进来。

3.CMake编译C/C++原理:

  1. CMake比Unix的make更为高级,使用起来要方便得多。

  2. 终端cmake命令将CMakeLists.txt文件建构为make所需要的makefile文件,
    最后用make命令编译源码生成可执行程序或共享库(so(shared object))
    因此CMake在Linux终端执行步骤总的来说就两个:
    1.cmake
    2.make

  3. 终端执行cmake后会生成很多编译中间文件以及makefile文件,一般会新建一个build目录专门用来编译:
    1.mkdir build
    2.cd build
    3.cmake . .
    4.make

       build的创建也可以在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项目构建过程:

  1. 首先,使用命令行:‘cmake ’,比如:cmake .. ,在你的构建目录(外部构建方式)下生成了项目文件project files。
    官方文档中又叫build tree/binary tree,这其中就包括,比如:Makefile,还有一些其他相关文件/目录/子目录。
  2. 其次,自然是对生成好的项目(project files)进行编译构建,使用到的就是你说的’cmake --build .’ 。
  3. 最后,–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”。

猜你喜欢

转载自blog.csdn.net/qq_44918090/article/details/126562391
今日推荐