写在前面
由于软件开发越来越工程化巨量化,不同于单文件的简单编译链接生成可执行文件,工程软件所涉及的依赖越来越复杂及文件数量越来越大,其编译链接过程十分复杂,因此掌握一套软件工程编译工具是很有必要的,并且对于复杂软件工程的开发及研究也是很有裨益。
CMake就是一款用于软件工程编译的工具。因为实际应用的程序大多数都是使用这个工具作为高层次工具,因此熟练掌握及应用这个工具对于之后的学习和工作有挺多的便利。本文基于自己对于CMake的认识和学习进行的简单总结,为了方便自己之后查看以及同样初学的同学参考。
目录
- 一. CMake基本认识
- 二. CMake基本使用步骤
- 三. CMakeLists基本概念
一. CMake基本认识
CMake
这个工具是为了方便使用make
编译构建工具而诞生的。因为make
工具本身是较为底层的编译构建工具,对于大型软件工程如果我们自己来编写makefile
这个难度较大而且可能也容易出错,而CMake
就是基于make
的高层次编译构建工具。
与make
工具类似,CMake
工具也需要编写构建文件,默认名为CMakeLists.txt
。CMake
工具利用编写好的编译构建文件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
编译构建文件。
对于形式如上的工程,整个编译构建过程如下:
- 切换当前目录至
build
文件目录下 - 运行命令行:
cmake ..
这句话的意思表示指定CMakeLists.txt
所在的目录,并且在build
目录下生成cmake cache
相关文件。同时Makefile
也在build
目录下生成完毕
- 运行命令行:
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_directories
和link_directories
命令。 - 在将可执行程序与动态链接库或静态链接库链接的部分,因为涉及到依赖库的寻找,cmake提供了
find_package
,include
等命令,除此之外也支持通过自定义变量的方法人为设定依赖库的路径。在该部分中,将库与可执行程序进行链接,cmake则提供了target_link_libraries
命令。 - 在这三部分中,因为还涉及到文件的搜索和处理,cmake也提供文件及字符串相关的命令。
网友评论