1 什么是CMake?
Cmake是一个编译、构建工具。使用CMakeLists.txt来描述构建过程,可以生成标准的构建文件,如Makefile。一般先编写CMakeLists.txt,然后通过cmake来生成Makefile,最后执行make进行编译。
1.1 cmake安装
在ubuntu上安装cmake非常简单,执行sudo apt-get install cmake即可。如果想安装最新的cmake版本,就需要自己进行源码编译安装。源码下载。源码编译安装非常简单,这里就不再详细描述了。
1.2 查看cmake版本
cmake安装完成后,执行cmake --version,即可查看cmake的版本号。我的是3.13.2
2 CMake的基本使用流程
- 编写CMakeLists.txt
- 执行cmake .;一般在工程根目录下
mkdir build;cd build
;然后执行cmake ..
;这样的目的是为了保证源码不会污染 - 执行make进行编译
3 CMake简单示例
这里给出一个简单的使用cmake进行构建的工程示例,目录结构如下:
test01
├── build
├── CMakeLists.txt
└── main.c
main.c文件如下:
#include <stdio.h>
int main(int argc, char** argv)
{
printf("hello cmake\n");
return 0;
}
CMakeLists.txt内容如下:
#设置cmake的最小版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
cmake_policy(SET CMP0048 NEW)
#设置项目名称
project(test01 VERSION "1.2.3.4")
# 获取项目名
message(${PROJECT_NAME})
message(${CMAKE_PROJECT_NAME})
# 获取项目源码目录
message(${PROJECT_SOURCE_DIR})
message(${test01_SOURCE_DIR})
# 获取build目录
message(${PROJECT_BINARY_DIR})
message(${test01_BINARY_DIR})
# 获取全版本号
message(${PROJECT_VERSION})
message(${test01_VERSION})
# 获取主版本号
message(${CMAKE_PROJECT_VERSION})
message(${PROJECT_VERSION_MAJOR})
message(${test01_VERSION_MAJOR})
message(${PROJECT_VERSION_MINOR})
message(${test01_VERSION_MINOR})
message(${PROJECT_VERSION_PATCH})
message(${test01_VERSION_PATCH})
message(${PROJECT_VERSION_TWEAK})
message(${test01_VERSION_TWEAK})
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})
#设置源文件
aux_source_directory(. dir_srcs)
message(${dir_srcs})
#设置可执行程序
add_executable(hello ${dir_srcs})
我这里mkdir 了build 目录,
cd build
cmake …
make
最后就会在当前目录下看到生成的test01可执行程序。
接下来,对上例中的CMakeLists.txt的语法进行解释。
-
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,符号"#"后面的内容被认为是注释。
Call the
cmake_minimum_required()
command at the beginning of the top-levelCMakeLists.txt
file even before calling theproject()
command. It is important to establish version and policy settings before invoking other commands whose behavior they may affect. See also policyCMP0000
. -
cmake_minimun_required
格式:cmake_minimum_required(VERSION <min>[…<max>][FATAL_ERROR])
设置该工程的cmake最低支持版本,注意"VERSION"不能写成小写,否则会报cmake_minimum_required called with unknown argument “version”.
-
project
project(<PROJECT-NAME> [LANGUAGES] [<language-name>...]) project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] [DESCRIPTION <project-description-string>] [HOMEPAGE_URL <url-string>] [LANGUAGES <language-name>...])
设置项目名。项目名会保存在
PROJECT_NAME
变量中。如果调用顶层CMakeLists.txt,项目名也会存在CMAKE_PROJECT_NAME
变量中。调用project命令后,会默认设置一下变量的值,例如,
PROJECT_SOURCE_NAME
,<PROJECT-NAME>_SOURCE_DIR
, 表示项目源码目录绝对路径PROJECT_BINARY_NAME
,<PROJECT-NAME>_BIANRY_DIR
,表示build目录绝对路径设置project版本号,注意需要
cmake_policy(SET CMP0048 NEW)
,可以通过如下变量获取版本号信息PROJECT_VERSION
,<PROJECT-NAME>_VERSION
PROJECT_VERSION_MAJOR
,<PROJECT-NAME>_VERSION_MAJOR
PROJECT_VERSION_MINOR
,<PROJECT-NAME>_VERSION_MINOR
PROJECT_VERSION_PATCH
,<PROJECT-NAME>_VERSION_PATCH
PROJECT_VERSION_TWEAK
,<PROJECT-NAME>_VERSION_TWEAK
CMAKE_PROJECT_VERSION
也可以获取project版本号,但是project命令要在顶层CMakeLists.txt使用。
LANGUAGES
默认支持c和c++。 -
aux_source_directory
aux_source_directory(<dir> <variable>)
Find all source files in a directory.Collects the names of all the source files in the specified directory and stores the list in the provided.
设置源文件名,从<dir>中找源文件名并存储到中。
-
add_executable
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])
将源文件([source1] [source2 …] )编译成可执行程序,可执行程序的名称由指定。
-
message
message通常可用于编译脚本的调试、跟踪。
补充:
cmake的命令包含4类: scripting commands,project commands,ctest commands,deprecated commands。