本文只是给出一个大概的说明,命令的详细用法以官方的参考手册为准
项目管理
命令 |
说明 |
project(name) |
指定当前项目的名称,一般是第一句,不用打引号 |
cmake_minimum_required(VERSION 3.4.1) |
指定最低版本 |
if(UNIX) , endif() |
判断当前系统是否是 Unix/Linux |
if(WIN32) , endif() |
判断当前系统是否是 Windows |
if(str1 STREQUAL str2) , else() , endif() |
判断字符串是否相等 |
set(var value) |
设置值。如果值比较长,可以直接在引号里面换行,不需要 \n |
set(var value CACHE STRING "description") |
创建一个变量(选项),默认值为 value (用户可使用 -D 更改其值),可以把 STRING 改成 PATH 或 FILEPATH ,在 CMake GUI 中会变成目录选择对话框 |
option(var description OFF) |
添加一个开关选项,描述内容必须要填 |
message(STATUS|WARNING|FATAL_ERROR msg_text) |
输出状态信息,如果输出 FATAL_ERROR 则结束 |
add_subdirectory(dir) |
加载并处理一个子文件夹下的 CMakeLists.txt 文件 |
include(file_or_module) |
加载并处理一个 .cmake 文件 |
return() |
直接从当前 cmake 文件返回 |
ExternalProject_Add(name URL url DOWNLOAD_DIR down_dir SOURCE_DIR unpack_dir CONFIGURE_COMMAND cmd1 BINARY_DIR build_dir INSTALL_COMMAND cmd2) |
从外部下载并构建项目 |
add_executable(target WIN32 sources) |
添加一个可执行文件(WIN32 表示入口点是 WinMain 而不是 main ,不影响 Linux) |
add_custom_command(...) |
添加编译前/后要执行的自定义命令,或者添加一个能生成一些文件的命令。参数较多请看官方文档 |
add_custom_target(...) |
添加新的编译目标,且可以自定义命令,参数较多请看官方文档 |
add_dependencies(target dep1 dep2) |
给一个编译目标(通常是 add_library 等创建的目标)添加依赖 |
install(TARGETS ${TARGT} RUNTIME DESTINATION dest_dir) |
安装命令,把编译后的文件复制到该文件夹下,参数较多请看官方文档 |
当你使用 ExternalProject_Add
、add_custom_command
、add_custom_target
执行自定义命令时,如果传入的命令是一个字符串,通常你需要使用 seperate_arguments(YOUR_OUT_CMD UNIX_COMMAND ${YOUR_COMMAND_STRING})
来将其切分。
源文件和头文件
命令 |
说明 |
include_directories(dir_path...) |
指定头文件目录 |
aux_source_directory(dir_path SOURCES) |
把一个目录中的所有文件视为源文件加入到变量中,这里是 SOURCES |
configure_file(input_file output_file) |
指定一个配置文件(.in 文件) |
list(APPEND variable_name value) |
给列表加入一个项目,例如单独添加一个源文件 |
string(CONCAT dst_str str) |
字符串拼接 |
enable_language(ASM) |
添加汇编文件支持 |
add_definitions("-DXX -DXXX=XXX") |
增加宏定义 |
set_source_files_properties(file1 file2 PROPERTIES prop1 value1 prop2 value2) |
设置源文件的属性,如 EXTERNAL_OBJECT TRUE GENERATED TRUE 将允许使用现有的 obj 文件进行链接 |
库
命令 |
说明 |
add_library(name SHARED|STATIC src_file_path...) |
添加一个库,多个路径之间不用逗号 |
add_library(name SHARED|STATIC IMPORTED) |
导入一个已经编译好的库 |
set_target_properties(name PROPERTIES IMPORTED_LOCATION lib_path) |
对于导入的库,手动指定它的位置 |
target_link_libraries(target_name lib_name ...) |
给程序链接依赖的静态库或动态库 |
find_library(variable_name lib_name) |
搜索库,并赋给变量 |
link_directories(lib_path) |
指定链接器搜索目录 |
find_package(name COMPONENTS components REQUIRED) |
搜索包(如 wxWidgets),而且是必须找到 |
尝试静态链接C库,即使使用了 -static
发现仍然不是静态链接的。需要加上
set_target_properties(myexe PROPERTIES
LINK_SEARCH_START_STATIC ON
LINK_SEARCH_END_STATIC ON)
变量
变量 |
说明 |
CMAKE_PROJECT_NAME |
项目名称 |
CMAKE_CXX_STANDARD |
C++ 标准,如 11 |
CMAKE_CXX_STANDARD_REQUIRED |
设置 ON |
CMAKE_CXX_FLAGS_DEBUG |
C++ 调试编译时使用的标志 |
CMAKE_CXX_FLAGS_RELEASE |
C++ 发行编译时使用的标志 |
CMAKE_EXE_LINKER_FLAGS |
链接时的标志 |
CMAKE_SHARED_LIBRARY_LINK_C_FLAGS |
共享库链接标志 |
CMAKE_BUILD_TYPE |
编译类型,Debug 、Release 、MinSizeRel 、RelWithDebInfo 四种 |
CMAKE_INSTALL_PREFIX |
安装目录前缀 |
CMAKE_MODULE_PATH |
模块路径,那里应该有一些 modulename.cmake 文件 |
TARGETS |
目标文件 |
SOURCES |
源文件 |
PROJECT_LINK_LIBS |
链接文件列表 |
CMAKE_SOURCE_DIR 或 PROJECT_SOURCE_DIR |
项目源文件路径(默认就是 CMakeList.txt 所在路径) |
CMAKE_BINARY_DIR 或 PROJECT_BINARY_DIR |
项目二进制文件路径(默认就是 CMakeList.txt 所在路径) |
CMAKE_CURRENT_BINARY_DIR |
外部编译时,指的是target目录,内部编译时,指的是顶级目录 |
CMAKE_CURRENT_SOURCE_DIR |
CMakeList.txt 所在的目录 |
CMAKE_CURRENT_LIST_DIR |
CMakeList.txt 的完整路径 |
CMAKE_TOOLCHAIN_FILE |
CMake 将会自动处理这个变量指定的 CMake 文件,其中设置了交叉编译相关的变量 |
CMAKE_C_COMPILER |
指定 C 编译器 |
CMAKE_CXX_COMPILER |
指定 C++ 编译器 |
CMAKE_LINKER |
指定 LD 工具 |
CMAKE_OBJCOPY |
指定 OBJCOPY 工具 |
CMAKE_OBJDUMP |
指定 OBJDUMP 工具 |
CMAKE_SIZE |
指定 SIZE 工具 |
CMAKE_ASM_COMPILER |
指定汇编器 |
CMAKE_VERBOSE_MAKEFILE |
默认为 FALSE,设置为 TRUE 则显示 Makefile 的详细内容,用于调试构建系统 |