第 3 步:添加库的使用要求

练习 1 - 添加库的使用要求

Usage requirements 目标参数允许更好地控制库或可执行文件的链接和包含行,同时还可以更好地控制 CMake 内部目标的传递属性。利用使用要求的主要命令是:

目标

添加库的使用要求。

有用的材料

要编辑的文件

  • MathFunctions/CMakeLists.txt

  • CMakeLists.txt

入门

在本练习中,我们将重构来自 Adding a Library 的代码以使用现代 CMake 方法。我们将让我们的库定义自己的使用要求,以便根据需要将它们传递给其他目标。在这种情况下,MathFunctions 将自己指定任何需要的包含目录。然后,消费目标 Tutorial 只需要链接到 MathFunctions 而不必担心任何额外的包含目录。

起始源代码在“Step3”目录中提供。在本练习中,完成“TODO 1”到“TODO 3”。

首先,在``MathFunctions/CMakeLists`` 中添加对 target_include_directories() 的调用。请记住 CMAKE_CURRENT_SOURCE_DIR 是当前正在处理的源目录的路径。

然后,更新(并简化!)对顶层 CMakeLists.txt 中的 target_include_directories 的调用。

构建并运行

创建一个名为 Step3_build 的新目录,运行 cmake 可执行文件或 cmake-gui 来配置项目,然后使用您选择的构建工具或使用 cmake --build 构建它。 来自构建目录。这是从命令行看起来像的复习:

mkdir Step3_build
cd Step3_build
cmake ../Step3
cmake --build .

接下来,使用新构建的 Tutorial 并验证它是否按预期工作。

解决方案

让我们更新上一步中的代码,以使用现代 CMake 的使用要求方法。

我们想声明任何链接到“MathFunctions”的人都需要包含当前源目录,而“MathFunctions”本身不需要。这可以用“接口”使用要求来表达。请记住“接口”意味着消费者需要但生产者不需要的东西。

在``MathFunctions/CMakeLists.txt`` 的末尾,使用带有``INTERFACE`` 关键字的 target_include_directories(),如下所示:

TODO 1: Click to show/hide answer
TODO 1:MathFunctions/CMakeLists.txt
target_include_directories(MathFunctions
          INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
          )

现在我们已经为``MathFunctions``指定了使用要求,我们可以安全地从顶级``CMakeLists.txt``中删除我们对``EXTRA_INCLUDES``变量的使用,在这里:

TODO 2: Click to show/hide answer
TODO 2:CMakeLists.txt
if(USE_MYMATH)
  add_subdirectory(MathFunctions)
  list(APPEND EXTRA_LIBS MathFunctions)
endif()

和这里:

TODO 3: Click to show/hide answer
TODO 3:CMakeLists.txt
target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )

请注意,使用这种技术,我们的可执行目标为使用我们的库所做的唯一事情就是使用库目标的名称调用 target_link_libraries()。在较大的项目中,手动指定库依赖项的经典方法很快就会变得非常复杂。