c

cmake使用

cmake的一些基本使用已经笔记记录

Posted by lerko on May 16, 2018

cmake的使用

cmake是什么?

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件, 而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件, 这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

一些cmake的基本指令

https://cmake.org/cmake/help/v3.9/manual/cmake-commands.7.html

cmake的指令分为下面几种

  1. Scripting Commands(脚本指令)
  2. Project Commands(项目指令)
  3. CTest Commands(测试指令)

脚本指令

名称 解释
break 退出指令
cmake_host_system_information  
cmake_minimum_required 使用的cmake的最低版本号
cmake_parse_arguments  
cmake_policy  
configure_file  
continue  
elseif  
else  
endforeach  
endfunction  
endif  
endmacro  
endwhile  
execute_process  
file  
find_file  
find_library  
find_package  
find_path  
find_program  
foreach  
function  
get_cmake_property  
get_directory_property  
get_filename_component  
get_property  
if  
include  
list  
macro  
mark_as_advanced  
math  
message  
option  
return  
separate_arguments  
set_directory_properties  
set_property  
set  
site_name  
string  
unset  
variable_watch  
while  

项目指令

名称 解释
cmake_minimum_required 使用的cmake的最低版本号
project 项目名称
add_executable 指定生成目标
aux_source_directory 查找目录下的所有源文件,并将名称保存到 DIR_SRCS 变量
add_library 指定生成动态链接库
add_subdirectory 添加子目录,子目录里面包含另外一个cmake项目 :add_subdirectory([子目录名称])
target_link_libraries 添加动态链接库 : target_link_libraries([当前项目名称] [动态链接库项目名称])
configure_file 添加配置文件,常量可以在c中使用
options cmake的配置文件
   

常见内置变量

变量的引用方式是使用“${}”,在IF中,不需要使用这种方式,直接使用变量名即可

定义变量 : set(NAME xxxx) 使用变量 : ${NAME}

一些常用的变量

名称 解释
CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR PROJECT_SOURCE_DIR 这三个变量内容一致,都指的是工程的顶级目录。
CMAKE_CURRENT_BINARY_DIR 外部编译时,指的是target目录,内部编译时,指的是顶级目录
CMAKE_CURRENT_SOURCE_DIR CMakeList.txt所在的目录
CMAKE_CURRENT_LIST_DIR CMakeList.txt的完整路径
CMAKE_CURRENT_LIST_LINE 当前所在的行
CMAKE_MODULE_PATH 如果工程复杂,可能需要编写一些cmake模块,这里通过SET指定这个变量
LIBRARY_OUTPUT_DIR BINARY_OUTPUT_DIR 库和可执行的最终存放目录
PROJECT_NAME 项目名称