内建函数
cmake_minimum_required(VERSION xxx)
:指明所需要的最低cmake版本为xxxproject([PROJECT_NAME] [CXX][C][Java])
:该函数用来定义工程名称,并指定工程支持的语言,支持的语言选项是可以忽略的,默认支持所有语言。set([VALUE_NAME] [VALIUE])
:该函数用来显式的定义变量,[VALUE]是一个可变参数列表。message(SEND_ERROR|STATUS|FAUAL_ERROR "echo message" ...)
:该函数用来向终端输出信息- SEND_ERROR:产生错误,生成过程被跳过
- STATUS:输出前缀为–的状态信息
- FATAL_ERROR:立即终止cmake过程
add_executable([OUTPPUT_NAME] [SOURCE_LIST])
:生成可执行文件- [OUTPPUT_NAME]:表示生成的可执行文件名
- [SOURCE_LIST]:表示生成可执行文件依赖的所有文件
add_library([LIB_NAME] [SOURCE_LIST])
:生成静态库- [LIB_NAME]:表示生成的静态库名(不包含静态库lib前缀和.a后缀)
- [SOURCE_LIST]:表示生成静态库依赖的所有文件
add_library([SO_NAME] SHARED [SOURCE_LIST])
:生成动态库- [SO_NAME]:表示生成的动态库名(不包含动态库lib前缀和.so后缀)
- SHARED:指明生成的库类型,生成动态库时应为
SHARED
- [SOURCE_LIST]:表示生成动态库依赖的所有文件
aux_source_directory([DIR] [VAR])
:将所有的[DIR]都赋值给[VAR]add_definitions("xxx xxx")
:设置编译选项以及参数include_directories([DIR])
:设置第三方库头文件所在路径,使用<>包括的第三方库也会在该路径下寻找link_directories([DIR])
:设置第三方静态/动态库的路径,类似编译选项中的-L
选项target_link_libraries([PROJECT_NAME] [LIB_NAME]...)
:设置要链接的第三方库,类似编译选项中的-l
选项aux_source_directory([DIR], [VAR])
:将[DIR]目录下的所有的cpp文件以绝对路径的方式赋值给[VAR]
cmake变量
CMAKE_VERBOSE_MAKEFILE
:表示是否输出详细的编译和链接信息,对应on/offEXECUTABLE_OUTPUT_PATH
:表示可执行文件的输出目录LIBRARY_OUTPUT_PATH
:表示链接库的输出目录CMAKE_CXX_FLAGS
:表示编译器的编译参数,后跟""引号内添加编译参数CMAKE_CXX_COMPILER
:表示使用的编译器,后跟""引号内指明编译器类型CMAKE_CXX_FLAGS_DEBUG
:debug版本特有的编译选项CMAKE_CXX_FLAGS_RELEASE
:release版本下特有的编译选项CMAKE_SOURCE_DIR
:CMakeLists.txt所在的路径
自定义变量
CMAKE_CURRENT_SOURCE_DIR
:表示当前CMakeLists.txt文件所路径CMAKE_SOURCE_DIR
:表示工程的顶层目录CMAKE_MODULE_PATH
:参见find_package
find_package
在使用第三方库的情况下,find_package的用来寻找第三方库的.h和.so/.a/文件所在的路径并将找到的路径设置为变量以供CMakeLists.txt的其他部分使用。
find_package(xxx)会去${CMAKE_MODULE_PATH}
的所有路径中去寻找xxx.cmake或config.cmake文件,这两个文件时库文件安装时自己安装的,将自己路径硬编码到其中。前者称为module模式,后者成为config模式。
xxx.cmake会提供以下变量:
<name>_FOUND
:表示是否查到<name>_INCLUDE_DIR
或<name>_INCLUDES
:表示头文件的位置<name>_LIBRARY
或<name>_LIBRARIES
或<name>_LIBS
:表示库文件路径和名称<name>_DEFINITIONS
include
在cmake中使用include(<arg1>)时,cmake会搜索系统安装的目录,也会搜索CMAKE_MODULE_PATH
指定的目录。