CMake是一个跨平台的安装/编译工具,它能用简单的语句描述所有平台的安装/编译过程。通常在Linux环境下,CMake根据CMakeLists.txt生成Makefile,在Makefile中定义了具体的编译过程。
一个简单的CMakeLists.txt文件如下所示:
cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0)
add_executable(test main.cc)
这个CMakeLists.txt文件总共3行:
cmake_minimum_required 声明了对cmake程序版本要求,不得低于3.10
project定义了该工程的项目名称,以及版本号为1.0
add_executable设置了编译后生成的可执行文件名字为test,源代码文件为main.cc
cmake的语法是由一系列类似于add_executable这样的命令组成,其参数用括号包裹放在后面。下面让我们列举一下cmake常用命令有哪些:
命令 |
用途 |
cmake_minimum_required |
声明对cmake版本号要求 |
project |
定义项目相关参数,包括名字、版本号等 |
add_executable |
声明可执行程序编译目标 |
add_library |
声明链接库编译目标 |
add_subdirectory |
添加子目录,需要在子目录中创建CMakeLists.txt文件 |
target_link_libraries |
添加链接库 |
include_directories |
添加头文件引用目录 |
include |
引用其他CMake代码 |
link_directories |
为连接器添加搜索路径 |
aux_source_directory |
自动检索代码源文件 |
find_package |
设置系统库依赖 |
set |
设置变量 |
add_definitions |
添加宏定义项 |
message |
输出cmake执行过程日志信息 |
if..elseif..else..endif |
分支判断语句 |
foreach...endforeach |
循环语句 |
macro |
相当于C里面的宏定义 |
function |
定义一个函数 |
cmake是为编译而生,其定义的各种命令都是为编译服务的,让我们来看一条常规的编译命令:
gcc -O3 -Wall -I./math/include -L./math/lib -lmath -DNO_PRINT -o test test.c
其对应的CMakeLists.txt文件如下
cmake_minimum_required(VERSION 3.10)
project(Test VERSION 1.0)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_BUILD_TYPE "Release")
add_definitions("-O3" "-Wall")
include_directories(./math)
link_directories(./math/lib)
target_link_libraries(math)
add_definitions("-DNO_PRINT")
if (!CMAKE_BUILD_TYPE STREQUAL "RELEASE")
add_definitions("-g")
endif()
add_executable(test main.cc)
如上所示,cmake内置了大量于编译指令对应的命令,同时还定义了编程常用的变量设置、分支语句、循环语句等流程控制命令