Cmake是一种工具, 通过读取CMakeList.txt来定制项目的编译流程, 从而生成特定平台相关的MakeFile(Linux)或Visual Studio工程(windows)
中文教程可以看hahack(本文参考的是这一篇)或者xierh
英文教程可以看CMake官网教程
CMakeList语法中不区分大小写, 使用空格区分不同的参数
基础
cmake_minimum_required(VERSION 3.10)
# set the project name
project(Tutorial1)
# add the executable
add_executable(Tutorial tutorial.cxx)
所有的cmake最少拥有以上三行.
第一行是指定了cmake的最低版本, 第二行是项目名称称谓Tutorial1, 第三行是执行构建, 可执行文件名为Tutorial
启用C++11
使用set向Cmake定义两个宏CMAKE_CXX_STANDARD 和CMAKE_CXX_STANDARD_REQUIRED
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
开始编译
在其他某一个目录下执行cmake directory
,就可以在自定义的目录开始构建项目源文件, 这叫做项目的外部构建
同级目录多个源文件的编译
当然可以选择把所有的原文件件写进add_executable()中, 也可以选择使用aux_sourcedirectory(<dir> <variable>)
命令, 该命令会把指定的目录下所以源文件加入到一个变量名称中. 变量名称的使用和Linux类似, dollar符+大括号
多级目录, 多个源文件
需要在子目录中也放置一个CMakeList.txt, 如果这个子目录要编译成静态库, 则用add_library(静态库名称 编译的文件)
代替add_executable
父目录中使用
add_subdirectory(子目录名称)
target_link_libraries(本项目名称, 使用的静态库的名称)
自定义编译规则
可以设置条件编译的宏定义
option(变量名称 描述 默认值ON/OFF)
定义一个选项
if(选项值) endif(选项值)
来条件编译
configure_file("文件名称" "文件名称")
通过.in文件生成.h文件
.in文件怎么写? #cmakedefine xxxx
其他参数
修改内置的变量就可
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
其他功能如在Cmake中设置项目版本号, 平台预检查或者生成安装包等可在用时再查