CMake官方教程使用说明及重点总结(中)

187 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 简单看下目录结构

image.png

这里我们简单总结一下,使用 `add_library`添加一个库目标文件,对其命名,指定源码文件即可。由于添加的库在子目录,所以需要在上层 CMakeLists.txt 中使用 `add_subdirectory` 将子目录加进来。主函数要想使用某个库,就需要使用 `target_link_libraries` 将可执行文件与库目标链接起来。同时还需要在主函数中引用对应的头文件,为了使头文件被识别,还需要在顶层的 CMakeLists.txt 中使用`target_include_directories` 包含对应的头文件所在目录。
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 的位置不需要重复包含头文件目录了。

image.png

因此顶层 CMakeLists.txt 只需要包含生成的头文件 TutorialConfig.h 所在的目录 ${PROJECT_BINARY_DIR}

image.png

步骤4:添加生成器表达式

练习1 -使用接口库设置c++标准

练习2 -用生成器表达式添加编译器警告标志

步骤5:安装和测试

练习1 -安装规则

练习2 -测试支持