-
CMake概述。
CMake是一个项目构建工具,并且跨平台。Vs的 nmake, Linux下的Gun make, Qt的qmake等很多IDE软件都支持。
CMake的主要优点有:
-
夸平台
-
能管理大型项目
-
简化编译构建过程和编译过程
-
可扩展:可以为cmake编写特定功能的模块,扩充cmake功能
-
-
CMake的使用
CMake支持大写、小写、混合大小写的命令。如果在编写CMakeLists.txt文件时使用的工具有对应的命令提示,那么大小写随缘即可,不要太过在意。
-
注释
# 这是一个 CMakeLists.txt 单行注释
#[[ 这是一个 CMakeLists.txt 文件 的多汗注释。
这是一个 CMakeLists.txt 文件
这是一个 CMakeLists.txt 文件]]
cmake_minimum_required(VERSION 3.0.0)
-
常用命令
#指定使用的 cmake 的最低版本
cmake_minimum_required(VERSION 3.0)
#项目名称
project(app)
#[[add_executable:定义工程会生成一个可执行程序
add_executable(可执行程序名 源文件名称)]]
add_executable(app main.cpp)
#set 定义变量 空格间隔
set(SRC_LIST a.cpp b.cpp c.cpp)
#set 定义变量 ;间隔
set(SRC_LIST a.cpp;b.cpp;c.cpp)
#搜索文件===========================================================
#1: aux_source_directory(< dir > < variable >)
#[[
dir:要搜索的目录
variable:将从dir目录下搜索到的源文件列表存储到该变量中]]
#搜索CMakeLists.txt当前文件夹下的/src内的所有文件并赋值给SRC_LIST
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
#2:file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
#[[
GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。
]]
file(GLOB APPSRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB APPHEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
#包含头文件=================================================================
#include_directories(headpath)
include_directories(${PROJECT_SOURCE_DIR}/include)
#包含静态库文件===============================================================
#指定静态库文件地址
#link_directories(<lib path>)
#连接静态文件库
#link_libraries(<static lib> [<static lib>...])
# 搜索指定目录下源文件
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 链接静态库
link_libraries(app ${SRC_LIST})
#包含动态库文件===============================================================
#[[target_link_libraries(
<target>
<PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)]]
add_executable(app main.cpp)
target_link_libraries(app my_dynamic_library)
#message消息日志提醒===============================================================
#message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)
#[[
(无) :重要消息
STATUS :非重要消息
WARNING:CMake 警告, 会继续执行
AUTHOR_WARNING:CMake 警告 (dev), 会继续执行
SEND_ERROR:CMake 错误, 继续执行,但是会跳过生成的步骤
FATAL_ERROR:CMake 错误, 终止所有处理过程
]]
# 输出一般日志信息
message(STATUS " path: ${PROJECT_SOURCE_DIR}")
# 输出警告信息
message(WARNING "path: ${PROJECT_SOURCE_DIR}")
# 输出错误信息
message(FATAL_ERROR "path: ${PROJECT_SOURCE_DIR}")
#变量操作追加=============================================================
#set(变量名1 ${变量名1} ${变量名2} ...)
#使用list拼接=============================================================
#数据追加
#list(APPEND <list> [<element> ...])
#数据追加
#list(REMOVE_ITEM <list> [<element> ...])
#获取 list 的长度。
#list(LENGTH <list> <output variable>)
#读取列表中指定索引的的元素,可以指定多个索引
#list(GET <list> <element index> [<element index> ...] <output variable>)
#连接字符串
#list (JOIN <list> <glue> <output variable>)
#查找是否存在
#list(FIND <list> <value> <output variable>)
#制作动态库或静态库===========================================================
#静态库 add_library(库名称 STATIC 源文件1 [源文件2] ...)
#动态库 add_library(库名称 SHARED 源文件1 [源文件2] ...)
#add_library 默认是静态库
add_library(app STATIC ${SRCLIST})
add_library(app SHARED ${SRCLIST})
#嵌套的CMake================================================================
#add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
-
常用宏
宏 | 功能 |
PROJECT_SOURCE_DIR | 使用cmake命令后紧跟的目录,一般是工程的根目录 |
PROJECT_BINARY_DIR | 执行cmake命令的目录 |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在的路径 |
CMAKE_CURRENT_BINARY_DIR | target 编译目录 |
EXECUTABLE_OUTPUT_PATH | 重新定义目标二进制可执行文件的存放位置 |
LIBRARY_OUTPUT_PATH | 重新定义目标链接库文件的存放位置 |
PROJECT_NAME | 返回通过PROJECT指令定义的项目名称 |
CMAKE_BINARY_DIR | 项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径 |
- DCMAKE_CXX_STANDARD 使用哪个C++标准库
# DCMAKE_CXX_STANDARD 使用C++ 的哪个标准 C++11、C++14、C++17、C++20
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#也可以一在执行cmake时添加宏 -D:定义的宏赋值
cmake .. -DCMAKE_CXX_STANDARD=11
- EXECUTABLE_OUTPUT_PATH 指定可执行程序输出的路径
#给HOME变量赋值:/home/gary/app/
set(HOME /home/gary/app/)
#EXECUTABLE_OUTPUT_PATH = /home/gary/app/bin
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
-
LIBRARY_OUTPUT_PATH 静态库输出路径
-
CMAKE_CURRENT_SOURCE_DIR 当前访问的 CMakeLists.txt 文件所在的路径。
-
PROJECT_SOURCE_DIR 等同于 CMAKE_CURRENT_SOURCE_DIR CMakeLists.txt当前路径