本文主要参考CMake
官方教程
概述
CMake
是一个MakeFile
生成器,由源代码生成各种MakeFile
后,交给Make
工具去编译;Windows
上也可以生成VS
工程,然后采用VS
进行编译;CMake
被用于C/C++
较多,但也能用于别的编程语言;
典型用法
# 指定cmake最小版本,考虑 本项目/子项目/链接库等 对cmake版本的要求
# 有的语句是从特定版本才开始支持的
cmake_minimum_required( VERSION 3.10 )
# 声明一个工程
project(MyProject)
# 添加一个可执行文件,源文件由main.cpp组成,也可后面再添加需要的内容
add_executable(main main.cpp)
# 添加一个库文件
add_library(mylib mylib.cpp)
# 添加包含目录,位置在CMakeLists.txt所在目录下的include/文件夹
target_link_directories(main PUBLIC include/)
# 将库文件链接到可执行文件
target_link_libraries(main mylib)
变量
CMake
中的变量可在IF
语句中直接调用,也可以在其它位置采用${VAR_NAME}
的方式调用。
可以使用set(VAR_NAME value)
来设置变量的值,不用声明。
可以在CMakeLists
中使用环境变量:$ENV{env_name}
。
CMake
中有很多内置变量,常用的有:
PROJECT_SOURCE_DIR
:CMakeLists.txt
所在目录PROJECT_BINARY_DIR
:调用cmake
指令的目录,如创建build
文件夹后,在build
文件夹中打开终端后cmake ..
,该变量的值就指向build
目录- 判断平台:
UNIX WIN32
- 判断编译器:
MSVC MINGW
,还可以MSVC_VERSION
获取MSVC
版本; CMAKE_RUNTIME_OUTPUT_DIRECTORY
,可简单理解为exe文件的输出目录;
CMAKE_LIBRARY_OUTPUT_DIRECTORY
:可简单理解为共享库dll或so文件的输出目录
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
:可简单理解为静态库lib或a文件的输出目录
以上3个变量还可以添加后缀,指定
_DEBUG
或_RELEASE
时的输出目录,不指定时将在设置的目录下在添加Debug/Release
目录:# debug模式下输出到对应目录,没有后缀时,将生成Debug/Release文件夹 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ./bin) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ./lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ./dll)
有3个类似的变量
RUNTIME_OUTPUT_DIRECTORY、LIBRARY_OUTPUT_DIRECTORY、ARCHIVE_OUTPUT_DIRECTORY
,但笔者在设置了之后,输出文件并没有生成在对应目录下。
这3个变量是由上述3个CMAKE_
开头变量对应初始化的。
更多信息请参考CMake Variables。
常用函数
-
project()
:设置项目名称,将其存储到PROJECT_NAME
变量中,在最顶层的CMakeLlists.txt
中调用时,也会将名称存储到CMAKE_PROJECT_NAME
中; -
configure_file(<input> <output>)
:将<input>
中的内容全部复制到<output>
中,并替换其中的@var@
或${var}
变量,可以实现将CMakeLists.txt
中的变量带入程序中的效果,比如:在CMakeLists.txt
中定义了程序版本,可以在程序中获取版本值; -
add_subdirectory( <dir> [bin_dir] [EXCLUDE_FORM_ALL] )
:为项目添加一个子目录,<dir>
指定子目录位置,[bin_dir]
指定生成目录,可以相对路径或是绝对路径,最后一个参数表明该子目录下的内容需要显式地编译或自行编译(一般用于示例代码等); -
option()
:添加CMake
调用时的选项,如option( USE_MYMATH "use my math lib" ON)
,然后可以这样调用:cmake -DUSE_MYMATH=OFF .
;而且,可以在configure_file
的<input>
中这样定义变量:#cmakedefine USE_MYMATH
,当选项为ON
时,该宏才会被定义到<output>
中,然后在程序中使用#ifdef USE_MYMATH
;option()
要在configure_file()
之前调用,因为后者要读取前者结果; -
target_include_directories()
:添加编译给定目标时的包含目录,比如添加源码目录下的include
文件夹target_include_directories( main PUBLIC ${PROJECT_SOURCE_DIR}/include)
-
install()
:将编译生成目标和一些文件等,安装到指定目录,常用形式:install( TARGETS mylib DESTINATION lib)
install( FILES mylib.h DESTINATION include)
常用功能
-
使用
C++11
:# specify the C++ standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)
-
指定
VS
工程版本:cmake -G "Visual Studio 14 2015" -A Win32 . cmake -G "Visual Studio 14 2015" -A x64 . cmake -G "Visual Studio 14 2015" -A ARM .
-
指定工具集,如采用
MSVC2017
编译器:# 140,141,142,143分别对应MSVC2015 2017 2019 2022 cmake -T v141 .