cmake使用初览

写在前面

由于软件开发越来越工程化巨量化,不同于单文件的简单编译链接生成可执行文件,工程软件所涉及的依赖越来越复杂及文件数量越来越大,其编译链接过程十分复杂,因此掌握一套软件工程编译工具是很有必要的,并且对于复杂软件工程的开发及研究也是很有裨益。

CMake就是一款用于软件工程编译的工具。因为实际应用的程序大多数都是使用这个工具作为高层次工具,因此熟练掌握及应用这个工具对于之后的学习和工作有挺多的便利。本文基于自己对于CMake的认识和学习进行的简单总结,为了方便自己之后查看以及同样初学的同学参考。

目录

  • 一. CMake基本认识
  • 二. CMake基本使用步骤
  • 三. CMakeLists基本概念

一. CMake基本认识

CMake这个工具是为了方便使用make编译构建工具而诞生的。因为make工具本身是较为底层的编译构建工具,对于大型软件工程如果我们自己来编写makefile这个难度较大而且可能也容易出错,而CMake就是基于make的高层次编译构建工具。

make工具类似,CMake工具也需要编写构建文件,默认名为CMakeLists.txtCMake工具利用编写好的编译构建文件CMakeLists.txt,生成makefile,之后再利用make工具完成实际的编译构建过程。因此我们可以看出CMake就是用于生成规范化的makefile的工具,实际上的编译构建工作还是由make实现,只不过CMake将编译构建过程进行了更高层次地抽象,更容易让人理解,减少了很多自己编写makefile文件可能存在的麻烦和可能出现的问题。除此之外,CMake还能方便地让人控制编译过程,可以提高软件工程编译构建的灵活性。

二. CMake基本使用步骤

CMake工具的基本使用离不开可执行程序cmake和编译构建文件CMakeLists.txt的配合。一个基本的使用CMake工具进行编译的软件工程的简单用法如下。

软件工程结构如下:

project
|--build
│--CMakeLists.txt
│--source.cpp
  • build:表示CMake生成的cache文件目录以及后续编译构建生成文件的保存目录。
  • CMakeLists.txt:CMake编译构建文件。

对于形式如上的工程,整个编译构建过程如下:

  1. 切换当前目录至build文件目录下
  2. 运行命令行:
cmake ..

这句话的意思表示指定CMakeLists.txt所在的目录,并且在build目录下生成cmake cache相关文件。同时Makefile也在build目录下生成完毕

  1. 运行命令行:
make

使用make工具完成编译构建过程。

三. CMakeLists基本概念

我们知道cmake需要结合编译文件CMakeLists.txt进行使用,并且CMakeLists.txt的编写更为重要。因此对CMakeLists.txt的使用和编写方法进行学习和掌握至关重要。在我学习的经验中,CMakeLists.txt文件中的内容可以总结为两点,一是控制编译的流程,二是提供编译构建过程中所需的命令。

1. 编译流程的控制

编译构建软件工程的工具一大作用就是为了程序化软件化控制编译的流程。因此cmake提供了大量相关的概念,如默认变量CMAKE_PREFIX_PATH以及自定义变量等等。其中默认变量提供了很多信息,不同的变量有着不一样的作用,有的表示路径等信息,有的是用于编译时提供编译参数等等,这一部分很繁杂而且需要根据实际的使用自己去确定,可以参考官方文档有个总体概念:https://cmake.org/cmake/help/v2.8.7/cmake.html#section_Variables 。除了默认的变量,cmake也支持自己定义变量来提供更多的信息,同时再结合CMakeListst的控制语句,因此可以根据需求抽象化整个编译流程。

2. 编译构建过程中所需的命令

编译构建工具更为重要的作用当然就是构建工程。而软件工程的构建就少不了解决软件依赖的问题,即寻找构建目标所依赖的各种库。cmake一般是用于构建C/C++工程。而C/C++工程的构建大致分为三部分,编译动态链接库或静态链接库,编译可执行程序部分,将可执行程序与动态链接库或静态链接库链接。因此cmake提供了大量的命令用于这三部分。

  • 在编译动态链接库或静态链接库部分,cmake提供了add_library的命令。
  • 在编译可执行程序部分,cmake提供了add_executable命令。在前面这两个部分中,又涉及到指定头文件路径以及库文件路径的需求,因此,cmake提供了include_directorieslink_directories命令。
  • 在将可执行程序与动态链接库或静态链接库链接的部分,因为涉及到依赖库的寻找,cmake提供了find_package,include等命令,除此之外也支持通过自定义变量的方法人为设定依赖库的路径。在该部分中,将库与可执行程序进行链接,cmake则提供了target_link_libraries命令。
  • 在这三部分中,因为还涉及到文件的搜索和处理,cmake也提供文件及字符串相关的命令。

你可能感兴趣的:(cmake使用初览)