本文主要参考CMake 官方教程
概述
CMake 是一个MakeFile 生成器,由源代码生成各种MakeFile 后,交给Make 工具去编译;Windows 上也可以生成VS 工程,然后采用VS 进行编译;CMake 被用于C/C++ 较多,但也能用于别的编程语言;
典型用法
cmake_minimum_required( VERSION 3.10 )
project(MyProject)
add_executable(main main.cpp)
add_library(mylib mylib.cpp)
target_link_directories(main PUBLIC include/)
target_link_libraries(main mylib)
变量
CMake 中的变量可在IF 语句中直接调用,也可以在其它位置采用${VAR_NAME} 的方式调用。
可以使用set(VAR_NAME value) 来设置变量的值,不用声明。
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 目录:
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 :
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
-
指定MSVC 编译器: cmake -G "Visual Studio 14 2015" -A Win32 .
cmake -G "Visual Studio 14 2015" -A x64 .
cmake -G "Visual Studio 14 2015" -A ARM .
|