CMake简介
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性。CMake的所有的语句都写在CMakeLists.txt的文件中。
CMake语法
- 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名;
- 指令(参数 1 参数 2…),参数使用括弧括起,参数之间使用空格或分号分开;
- 指令是大小写无关的,参数和变量是大小写相关的。但推荐你全部使用大写指令。
- 以#开头,到行末尾的是注释
- cmake的构建指令为"cmake path [参数选项]"
外部构建
cmake有两种构建的语法:
cmake .
make
或者
mkdir build
cd build
cmake ..
make
两种方法最大的不同在于执行cmake和make的工作路径不同。
第一种方法中,cmake生成的所有中间文件和可执行文件都会存放在项目目录中;称为“内部构建”。而第二种方法中,中间文件和可执行文件都将存放再build目录中。
第二种方法的优点显而易见,它最大限度的保持了代码目录的整洁。同时由于第二种方法的生成、编译和安装是发生在不同于项目目录的其他目录中,所以第二种方法就叫做“外部构建”。cmake强烈推荐使用外部构建的方法。
CMAKE_EXPORT_COMPILE_COMMANDS选项
默认不开启,开启的两种方法:
- 在CMakeLists.txt中添加 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
- 在命令行中添加-DCMAKE_EXPORT_COMPILE_COMMANDS=on
开启后,其生成的文件compile_commands.json,包含所有编译单元所执行的指令
CMake命令
cmake_minimum_required命令
cmake_minimum_required (VERSION 2.6)
规定cmake程序的最低版本。这行命令是可选的,我们可以不写这句话,但在有些情况下,如果CMakeLists.txt文件中使用了一些高版本cmake特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行cmake。
project命令
project (NetLib)
指定项目的名称(CMAKE_PROJECT_NAME)。项目最终编译生成的可执行文件名称则是由ADD_EXECUTABLE命令来指定的。
但是这个项目名称还是必要的,在cmake中有两个预定义变量:
< projectname >_BINARY_DIR以及< projectname >_SOURCE_DIR
比如在我的项目中,两个变量分别为:NetLib_BINARY_DIR和NetLib_SOURCE_DIR。
同时cmake还预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量。
在我的项目中,PROJECT_BINARY_DIR等同于NetLib_BINARY_DIR,PROJECT_SOURCE_DIR等同于NetLib_SOURCE_DIR。
在实际的应用用,我强烈推荐使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,这样即使项目名称发生变化也不会影响CMakeLists.txt文件。
内部构建情况下两个变量值相同。在外部构建的情况下,PROJECT_SOURCE_DIR指向的目录同内部构建相同,为CMakeList.txt所在的目录(假定为workDirectory),而PROJECT_BINARY_DIR则有所不同,指向workDirectory/build目录。
SET命令
SET命令可以用来显式的定义变量。如:
SET(CMAKE_INSTALL_PREFIX /usr/local)
CMAKE_INSTALL_PREFIX表示可执行文件的安装路径。
<