1. 流程
- 写CMake 的配置文件 CMakeLists.txt 文件
- 执行命令:cmake path, 生成Makefile文件 (path是 CMakeLists.txt文件所在的位置)
- 执行make 进行编译
2. 语法
- 由”命令“、”注释“、”空格“组成,命令不区分大小写
- 注释使用#,块注释使用 #[[ content ]]
- 命令由“命令名称“、”小括号“、”参数“组成,参数之间使用空格间隔
- 变量的引用:${VAR}
3. 预定义变量
- PROJECT_SOURCE_DIR:工程根目录
- PROJECT_BINARY_DIR:运行cmake指令的目录
- CMAKE_INCLUDE_PATH:环境变量
- CMAKE_LIBRARY_PATH:环境变量
- CMAKE_CURRENT_BINARAY_DIR:target 编译目录
- CMAKE_CURRENT_SOURCE_DIR:CMakeLists.txt文件所在目录
- CMAKE_CURRENT_LIST_DIR:引用这个变量所在文件的全目录
- EXECUTABLE_OUTPUT_PATH:重新定义最终目标文件的存储路径
- LIBRARY_OUTPUT_PATH:重新定义链接库文件的存储路径
- CMAKE_C_COMPILER:指定C编译器
- CMAKE_CXX_COMPILER:指定c++编译器
4. 常用命令
4.1 脚本命令
4.1.1option
用于控制编译流程,相当于宏定义
格式:
option(<variable> "<help_text>" <value>)
- variable:定义选项名称
- value:定义选项默认状态,一般是OFF或者ON,除去ON之外,其他所有值都为认为是OFF。
- help_text:说明选项的含义
可在执行cmake 时直接改变 variable的value
$ cmake .. -D<variable>=OFF
4.2 工程命令
#声明 cmake 版本
cmake_minimum_required(VERSION 3.8)
#设置项目名称为demo
project(demo)
#添加编译选项
add_compile_options("-g -Wall")
#添加编译参数或宏定义
add_definitions(-DDEBUG)
#是cmake v3.12 后添加的,相比于 add_difinitions,功能更加单一且参数使用灵活
add_compile_definitions(DEBUG)
#交叉编译
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER /opt/arm-linux-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm-linux-g++)
#生成动态库libname
add_library(libname SHARED ${LIB_SRC})
#生成静态库libname
add_library(libname STATIC ${LIB_SRC})
#生成可执行文件demo,parn为demo的依赖文件
add_executable(demo par1 par2 ...)
#为target指定依赖的target,目标必须是 add_executable、add_library、add_custom_target 命令创建的目标
add_dependencies(target target1)
#指定目录<dir>下的所有源文件名,存到指定的变量名<SRC_LIST>中,只指定dir目录下的文件,dir目录的目录未包含
aux_source_directory(dir SRC_LIST)
#添加子目录dir, dir下需要也有CMakeLists.txt文件
add_subdirectory(dir)
#添加多个头文件搜索路径,当项目需要的头文件不在系统默认的搜索路径下时,可指定改路径
include_directories(dir1 dir2 ...)
#添加动态库或静态库的搜索路径
link_directories(dir)
#执行文件demo 添加动态库 libpthread.so
target_link_libraries(demo -lpthread)
#执行文件demo 添加静态库 libnet.a
target_link_libraries(demo net)