持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情。 写文章不易,阅读之前请给我点个赞吧~
官方教程使用说明及总结
一、教程预览
本节内容可独立阅读,如果想从最基础的部分学起,请阅读上一篇文章CMake官方教程使用说明及重点总结上
我们将通过上中下讲述这个部分的内容,这里讲述中的部分
上主要讲述:
- 步骤1:一个基本的起点
- 练习1 -建立一个基本项目
- 练习2 -指定c++标准
- 练习3 -添加版本号和配置的头文件
中主要讲述:
- 步骤2:添加库
- 练习1 -创建库
- 练习2 -使我们的库可选
- 步骤3:添加库使用要求
- 练习1 -添加库的使用要求
- 步骤4:添加生成器表达式
- 练习1 -使用接口库设置c++标准
- 练习2 -用生成器表达式添加编译器警告标志
- 步骤5:安装和测试
- 练习1 -安装规则
- 练习2 -测试支持
下主要讲述:
- 步骤6:添加对测试仪表板的支持
- 步骤7:添加系统自检
- 步骤8:添加自定义命令和生成文件
- 步骤9:打包安装程序
- 步骤10:选择静态库或共享库
- 步骤11:添加导出配置
- 步骤12:打包、调试和发布
二、实战串讲
打开 Step2 的项目。
步骤2:添加库
在这一步中,我们将学习如何在我们的项目中创建和使用库。我们还将了解如何使库的使用成为可选的。
练习1 -创建库
要在CMake中添加库,使用 add_library() 命令并指定应该组成库的源文件。
我们可以用一个或多个子目录来组织项目,而不是将所有源文件放在一个目录中。在本例中,我们将专门为库创建一个子目录。在这里,我们可以添加一个新的 CMakeLists.txt 文件和一个或多个源文件。在顶层的 CMakeLists.txt 文件中,我们将使用 add_subdirectory() 命令将子目录添加到构建中。
一旦创建了库,它将通过 target_include_directories() 和target_link_libraries() 连接到可执行目标。
我们可以使用 tree /f 简单看下目录结构
target_include_directories(Tutorial PUBLIC
"${PROJECT_SOURCE_DIR}/MathFunctions"
)
练习2 -使我们的库可选
list() 列出了我们的库目标文件的可选项,目前只有 MathFunctions ,起个名字叫 EXTRA_LIBS;所以与之配对的还要设置 include 可选项,命令为 EXTRA_INCLUDES,这里需要添加一个关键字 APPEND 去附加我们的库所需头文件的路径。
list(APPEND EXTRA_LIBS MathFunctions)
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
步骤3:添加库使用要求
练习1 -添加库的使用要求
我们将让我们的库定义自己的使用需求,以便在必要时将它们传递给其他目标。在本例中,MathFunctions 将指定自己所需的任何包含目录。然后,消费者目标(也就是使用者目标,这里指的是使用 MathFunctions 的目标) Tutorial 只需要链接到 MathFunctions,而不必担心任何额外的包含目录的问题。
需要在 MathFunctions/CMakeLists.txt 中添加下面的代码
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
这里想要实现任何链接到 MathFunctions 的人都需要包含当前源目录,而 MathFunctions 本身不需要。这可以用 INTERFACE 使用需求来表示。记住 INTERFACE 指的是消费者需要但生产者不需要的东西。
所以链接 MathFunctions 这个 INTERFACE 的位置不需要重复包含头文件目录了。
因此顶层 CMakeLists.txt 只需要包含生成的头文件 TutorialConfig.h 所在的目录 ${PROJECT_BINARY_DIR}。