1、cmake
cmake是用于构建、测试和软件打包的跨平台工具
2、优势
- 避免硬编码路径
- 可在多台计算机上构建一个包
- 可做持续集成
- 支持不同操作系统
- 支持多个编译器
- 可使用IDE
- 使用库
- 描述程序的逻辑结构
- 单元测试
3、持续集成
自动化(提交、发布、自动化测试),准确发现集成错误
4、cmake工作原理
5、cmake安装
https://blog.csdn.net/u011231598/article/details/80338941
6、构建和运行
创建src源码文件和build编译文件
进入build目录下,指定版本编译src
cmake -G "MinGW Makefiles" ..\src
不指定版本默认为vs
cmake ..\src
构建:在当前目录下
cmake --build .
7、说明
- cmake命令不区分大小写,但是变量和参数区分
- 参数用空格或者分号隔开
- 使用
${VAR}
引用变量 - 引号可加可不加,如果有字符串就必须加
8、概念
- 目标文件(target):可执行文件(add_eexecutable)、库文件(add_library)
- 命令(cmake-command):下面要讲的函数
- 变量(cmake-variable):以
CMake_
开头 - 属性(cmake-properties):文件/文件夹都有各自的属性
9、命令
https://cmake.org/cmake/help/latest/
https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html
9.1 project
设置项目名
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[].<patch>[.<tweak>]]])
[LANGUAGES <language-name>...]
# 项目名会被存储在变量 PROJECT_NAME 和 CMAKE_PROJECT_NAME中
# PROJECT_SOURCE_DIR 等价于 <project-name>_SOURCE_DIR
# 可使用message函数输出
message(${PROJECT_NAME})
message(${PROJECT_SOURCE_DIR})
message(${demo_SOURCE_DIR})
9.2 add_executable
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
# <name>为可执行文件的名字,与项目名称无关
# win会生成<name>.exe文件
# 如:
add_executable(demo main.cpp)
9.3 message
message([<mode>] "message text" ...)
# 如:
message(STATUS "${PROJECT_VERSION_MAJOR}")
9.4 set
设置变量
set(<variable> <value>... [PARENT_SCOPE])
# 如:
set(a 1)
设置c++标准
set(CMAKE_CXX_STANDARD 11)
设置输出目录
# 设置exe文件出书目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# 设置存档目标文件的输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
9.5 option
定义一个开关
option(<variable> "<help_text>" [value])
# value的值为ON 或者 OFF,默认为OFF
# 如:
option(VERSION_ENABLE "output version" ON)
9.6 configure_file
将输入文件进行替换并生成输出文件
configure_file(<input> <output>
[NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
FILE_PERMISSIONS <permissions>...]
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
# 输入文件中的 @VAR@ 或 ${VAR} 的字符串会被替换成这些变量的当前值,未定义则是空字符串
config.h.in
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
编译后
config.h
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 0
#cmakedefine VAR
// 会被替换成一下两者之一,取决于VAR是否被设置
#define VAR
#undef VAR
9.7 include_directories
将给定的目录添加到编译器用于搜索包含文件的目录中。
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
# 目录会被添加到当前文件的 INCLUDE_DIRECTORIES 属性中
# 当前文件的每一个目标文件的INCLUDE_DIRECTORIES 属性也会添加该目录
9.8 target_include_directories
将包含目录添加到目标。
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
# 目标文件有 INCLUDE_DIRECTORIES 和 INTERFACE_INCLUDE_DIRECTORIES 两个属性
# INCLUDE_DIRECTORIES 对内头文件目录
# INTERFACE_INCLUDE_DIRECTORIES 对外头文件目录
# 包含src目录到目标
target_include_directories(demo PUBLIC "${PROJECT_BINARY_