CMake⼯程指南-2
1.CMake ⼯程实践场景
上⼀章我们介绍了cmake的基础命令⾏,介绍了如何⽣成构建⽂件,编译链接,安装等。本章节
我们会带领⼤家从⼀⾏⼀⾏⼿写CMake⽂件的⽅式开始,逐步熟悉如何⽤CMake 来管理各个场景下的 ⼯程需求,⽐如编译⼆进制,静态库,动态库,打包发布程序等。过程中也会逐步的介绍⼀些核⼼的 语法和函数,并⽤⼀些简单的例⼦来演⽰和验证。
1.1 可执⾏⽂件(编译-链接-安装)
本例⼦我们会编译和链接⼀个最简单的输出 hello world的C++程序 可执⾏程序,并本地运⾏,然后 安装到系统⽬录下。过程中会介绍⼀些遇到的新的CMake函数。
1.1.1 单步操作
我们创建⼀个新的 install_hello ⼯程
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl;
return 0;
}
新建⽂件-CMakeLists.txt
# 1 设置最低cmake 版本
cmake_minimum_required(VERSION 3.18)
#2 设置项⽬名称
project(InstallHello
VERSION 1.2.3
LANGUAGES C CXX
)
# 3 添加构建⽬标
add_executable(hello main.cpp)
# 4 安装到本地
include(GNUInstallDirs)
install(TARGETS hello)
# printf
message(STATUS "PROJECT_NAME: ${PROJECT_NAME}")
# print version
message(STATUS "PROJECT_VERSION:" ${PROJECT_VERSION})
message(STATUS "PROJECT_VERSION_MAJOR:" ${PROJECT_VERSION_MAJOR})
message(STATUS "PROJECT_VERSION_MINOR:" ${PROJECT_VERSION_MINOR})
message(STATUS "PROJECT_VERSION_PATCH:" ${PROJECT_VERSION_PATCH})
# 打印 默认安装路径
message(STATUS "CMAKE_INSTALL_PREFIX:" ${CMAKE_INSTALL_PREFIX})
运⾏CMake
mkdir build && cd build
cmake ../
编译链接
cmake --build .
运⾏
./hello
安装
cmake --install .
运⾏

在 Linux 系统中,“安装” 指的是将编译好的⼆进制,库⽂件(通常是.a .so⽂件)及其头⽂件复
制到系统标准路径或⾃定义路径,以便其他程序可以链接和使⽤该库。放在标准路径下的 动态库和⼆ 进制,在其他程序链接时,甚⾄可以不⽤单独指定 gcc的 -L 和 -I 参数,gcc就可以在默认路径下⾃动查 找,从⽽简化编译流程。普通的⼆进制安装到默认路径下,也不⽤的在独⽴指定PATH,shell 解释器也 可以找到⼆进制,并运⾏
2.1重点命令解释
下⾯我们会进⼀步介绍上⾯出现在CMakeLists.txt的新函数
2.1.1cmake_minimum_required
函数作⽤:
指定项⽬所需的最低 CMake 版本,应放在顶级 CMakeLists.txt 的第⼀⾏。
基本形式
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
参数解释:
2.1.2 project
函数作⽤:
指定项⽬名字,放在顶级CMakeLists⽂件的第⼆⾏,⼦⽬录中⼀般⽆需调⽤
基本形式
project(<PROJECT-NAME>)
完整形式
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
关键参数
PROJECT_NAME 变量的使⽤场景:
1 动态库的输出名称
2 cmake配置⽂件的名称
3 命名空间的名称
PROJECT_VERSION 变量的使⽤场景:
1 打印变量
2 ⽣成pkg-config或者.cmake对应的版本配置⽂件
3 动态库/静态库的的版本号
2.1.3 include
函数作⽤:
加载指定的脚本⽂件或者模块到当前CMakeLists执⾏上下⽂中并运⾏。
基本形式
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>] [NO_POLICY_SCOPE])
关键参数
<file|module> 要运⾏的的⽂件或模块名称。
从⽂件或模块加载并运⾏ CMake 代码。
1 ⽂件的搜索路径:
◦ 如果指定的是相对路径,则相对当前的正在执⾏的CMakeLists.txt 所在的⽬录。
◦ 如果是绝对路径,那直接从对应的磁盘⽂件读取⽂件并加载执⾏。
2 Module 搜索路径顺序:
◦ ⾸先在当前⽬录查找指定⽂件。
◦ 然后在 CMAKE_MODULE_PATH 变量指定的⽬录中查找。
3 执⾏逻辑:
◦ 在当前执⾏上下⽂执⾏被包含的camke代码。
2.1.4 install
函数作⽤:
安装(简单理解为cp) 将 ⼆进制,静态库,动态库,头⽂件,配置⽂件 部署到指定⽬录。
基本形式
install(TARGETS <targets>... [EXPORT <export-name>]
[RUNTIME DESTINATION <dir>]
[LIBRARY DESTINATION <dir>]
[ARCHIVE DESTINATION <dir>]
[INCLUDES DESTINATION <dir>]
[...])
install(FILES <files>... DESTINATION <dir>
[PERMISSIONS <permissions>...]
[CONFIGURATIONS <configs>...]
[COMPONENT <component>]
[...])
install(DIRECTORY <dirs>... DESTINATION <dir>
[FILE_PERMISSIONS <permissions>...]
[DIRECTORY_PERMISSIONS <permissions>...]
[...])
install(EXPORT <export-name> DESTINATION <dir>
[NAMESPACE <namespace>::]
[FILE <filename>]
[...])
关键参数
2.1.5 add_executable
函数作⽤:
指⽰ cmake 从源代码⽣成⼀个可执⾏⽂件。
基本形式
add_executable(<target_name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
关键参数
默认情况下,将在与调⽤命令的CMakeLists.txt的⽬录相对应的 build tree directory 中创建可执⾏⽂ 件。 也可以使⽤ RUNTIME_OUTPUT_DIRECTORY ⽬标属性的更改默认的输出位置。
至此,本节内容到此结束,感谢大家的观看!