【问题标题】:Examples of when PUBLIC/PRIVATE/INTERFACE should be used in cmake何时应在 cmake 中使用 PUBLIC/PRIVATE/INTERFACE 的示例
【发布时间】:2021-12-15 08:59:03
【问题描述】:

我正在阅读有关 cmake 关键字 PUBLICPRIVATEINTERFACE 的内容,并在 cmake 文档中看到了这段 here

通常,如果依赖项仅用于库的实现,而不是在头文件中,则应在使用 target_link_libraries() 和 PRIVATE 关键字时指定依赖项。如果在库的头文件中额外使用了依赖项(例如,用于类继承),则应将其指定为 PUBLIC 依赖项。一个不被库的实现使用,而只被它的头文件使用的依赖应该被指定为一个 INTERFACE 依赖。

我了解您在这三个关键字之间的选择如何影响target_link_librariestarget_include_directories 的行为,但我不明白本段中解释的三种情况之间的区别。有人可以提供一个玩具示例

  1. 在库的实现中使用依赖项,但不在头文件中使用依赖项 (PRIVATE)
  2. 在库的实现和头文件中使用依赖项 (PUBLIC)
  3. 在库的头文件中使用依赖项,但不在实现中使用 (INTERFACE)

【问题讨论】:

  • 有人可以提供一个玩具示例如果它不起作用,为什么不公开你自己的玩具示例?

标签: c++ cmake


【解决方案1】:

我们先来处理PUBLICPRIVATE

假设您正在编写一个带有 Qt GUI 的工具。您这个 GUI 应该允许您使用插件向 GUI 动态添加元素。此外,用户应该能够通过设置激活和停用插件,并且需要在以后启动程序时激活相同的插件。

因此,您的库提供了 2 个功能:

  1. 创建 Qt GUI 元素。您需要在公共标头中使用来自 Qt 的类型,因此您将 Qt 包含添加到这些标头中。每个库都需要访问 Qt 标头,因此您链接 Qt PUBLICly
  2. 为了保留插件设置,您选择 Boost.JSON 将设置存储在文件系统上给定位置的文件中。您的库的用户实际上不会自己处理 JSON 解析/写入,因此您不要在公共标头中包含任何 boost 标头并链接 Boost.JSON PRIVATEly。

INTERFACE可见性

您很少会使用这种可见性。通常您需要访问标题等。在您自己的库中。

仅标题库是使用INTERFACE 可见性的一种情况。仅标头库实际上不会导致在您的构建系统中创建目标,并且它们不能单独构建。 CMake 目标本身只是一种通过target_link_libraries 提供标头和依赖库的便捷方式。

另一个使用INTERFACE 可见性的场景是导入的目标。这些也没有编译为您的项目的一部分。它们仅包含有关已构建库的信息。对于导入的目标,您只能使用INTERFACE visibility。

【讨论】:

  • 仅标头库不需要INTERFACE 吗?
猜你喜欢
  • 2022-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多