繁体   English   中英

cmake 中何时应使用 PUBLIC/PRIVATE/INTERFACE 的示例

[英]Examples of when PUBLIC/PRIVATE/INTERFACE should be used in cmake

我正在读关于cmake的关键字PUBLICPRIVATEINTERFACE和整个本段来到这里在cmake的文档。

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

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

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

让我们首先处理PUBLICPRIVATE

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

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

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

INTERFACE可见性

您很少会使用此可见性。 通常你需要访问标题等。 在你自己的图书馆里。

值得注意的例外是只有头文件的库。 这些实际上不会导致在您的构建系统中创建目标,并且它们不能单独构建。 CMake 目标本身只是一种通过target_link_libraries提供头文件和依赖库的便捷方式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM