|
本文主要参考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 .
|