导航

  • 索引
  • 下一个 |
  • 上一个 |
  • CMake 4.0.0 »
  • 文档 »
  • cmake-properties(7) »
  • INTERFACE_LINK_LIBRARIES_DIRECT

INTERFACE_LINK_LIBRARIES_DIRECT¶

在 3.24 版本中添加。

此库的消费者应视为直接链接依赖项的库列表。

此目标属性可以设置为包含依赖目标的最终直接链接依赖项集合中的项。请参阅 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 目标属性以排除项。

依赖目标的直接链接依赖项的初始集合由其 LINK_LIBRARIES 目标属性指定。间接链接依赖项由直接链接依赖项的 INTERFACE_LINK_LIBRARIES 属性的传递闭包指定。任何链接依赖项都可以使用 INTERFACE_LINK_LIBRARIES_DIRECT 目标属性指定额外的直接链接依赖项。然后,对直接链接依赖项的集合进行过滤,以排除任何依赖项的 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 目标属性命名的项。

INTERFACE_LINK_LIBRARIES_DIRECT 的值可以使用 generator expressions。

注意

INTERFACE_LINK_LIBRARIES_DIRECT 目标属性旨在用于高级用例,例如将静态插件注入到消费的可执行文件中。它不应用作组织对 target_link_libraries() 的常规调用的替代品。

作为用法要求的直接链接依赖项¶

INTERFACE_LINK_LIBRARIES_DIRECT 和 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 目标属性是 用法要求。它们的效果传递性地传播到依赖目标,因此可能会影响依赖库链中每个目标的直接链接依赖项。每当某个库目标 X 链接到另一个库目标 Y,而后者的直接或传递用法要求包含 INTERFACE_LINK_LIBRARIES_DIRECT 或 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 时,这些属性可能会影响 X 的直接链接依赖项列表

  • 如果 X 是共享库或可执行文件,则其依赖项将被链接。它们还会影响编译 X 的源文件时使用的用法要求。

  • 如果 X 是静态库或对象库,它实际上不进行链接,因此其依赖项最多会影响编译 X 的源文件时使用的用法要求。

这些属性也可能影响 X 的依赖项的直接链接依赖项列表

  • 如果 X 公开链接 Y

    target_link_libraries(X PUBLIC Y)
    

    那么 Y 将放置在 X 的 INTERFACE_LINK_LIBRARIES 中,因此 Y 的用法要求,包括 INTERFACE_LINK_LIBRARIES_DIRECT、INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE,以及它们添加的直接链接依赖项声明的用法要求,都将传播到 X 的依赖项。

  • 如果 X 是静态库或对象库,并且私有链接 Y

    target_link_libraries(X PRIVATE Y)
    

    那么 $<LINK_ONLY:Y> 将放置在 X 的 INTERFACE_LINK_LIBRARIES 中。Y 的链接要求,包括 INTERFACE_LINK_LIBRARIES_DIRECT、INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE,以及它们添加的直接链接依赖项声明的传递链接依赖项,都将传播到 X 的依赖项。但是,Y 的非链接用法要求会被 LINK_ONLY 生成器表达式阻止,并且不会传播到 X 的依赖项。

  • 如果 X 是共享库或可执行文件,并且私有链接 Y

    target_link_libraries(X PRIVATE Y)
    

    那么 Y 不会放置在 X 的 INTERFACE_LINK_LIBRARIES 中,因此 Y 的用法要求,甚至 INTERFACE_LINK_LIBRARIES_DIRECT 和 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE,都不会传播到 X 的依赖项。

  • 在所有情况下,X 的 INTERFACE_LINK_LIBRARIES 的内容不受 Y 的 INTERFACE_LINK_LIBRARIES_DIRECT 或 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 的影响。

可以限制 INTERFACE_LINK_LIBRARIES_DIRECT 和 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 对依赖目标子集的影响,方法是使用 TARGET_PROPERTY 生成器表达式。例如,要将效果限制为可执行目标,请使用以下形式的条目

"$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:...>"

类似地,要将效果限制为特定目标,请使用以下形式的条目

"$<$<BOOL:$<TARGET_PROPERTY:USE_IT>>:...>"

此条目将仅影响将其 USE_IT 目标属性设置为真值的目标。

直接链接依赖项排序¶

目标的直接链接依赖项列表是从其 LINK_LIBRARIES 目标属性中的初始有序列表计算得出的。对于每个项,都会从其直接和传递 INTERFACE_LINK_LIBRARIES_DIRECT 用法要求中发现其他直接链接依赖项。每个发现的项都注入到指定它的项之前。但是,发现的项最多添加一次,并且仅当它没有出现在初始列表中的任何位置时才添加。这使得 LINK_LIBRARIES 可以控制其显式指定的那些直接链接依赖项的顺序。

收集完所有直接链接依赖项后,将从最终列表中删除所有其 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 用法要求命名的项。这不会影响剩余项的顺序。

示例:静态插件¶

考虑一个静态库 Foo,它为消费应用程序可执行文件提供静态插件 FooPlugin,其中插件的实现依赖于 Foo 和其他内容。在这种情况下,应用程序应直接链接到 FooPlugin,在 Foo 之前。但是,应用程序作者只知道 Foo。我们可以如下表示这一点

# Core library used by other components.
add_library(Core STATIC core.cpp)

# Foo is a static library for use by applications.
# Implementation of Foo depends on Core.
add_library(Foo STATIC foo.cpp foo_plugin_helper.cpp)
target_link_libraries(Foo PRIVATE Core)

# Extra parts of Foo for use by its static plugins.
# Implementation of Foo's extra parts depends on both Core and Foo.
add_library(FooExtras STATIC foo_extras.cpp)
target_link_libraries(FooExtras PRIVATE Core Foo)

# The Foo library has an associated static plugin
# that should be linked into the final executable.
# Implementation of the plugin depends on Core, Foo, and FooExtras.
add_library(FooPlugin STATIC foo_plugin.cpp)
target_link_libraries(FooPlugin PRIVATE Core Foo FooExtras)

# An app that links Foo should link Foo's plugin directly.
set_property(TARGET Foo PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT FooPlugin)

# An app does not need to link Foo directly because the plugin links it.
set_property(TARGET Foo PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE Foo)

应用程序 app 只需要指定它链接到 Foo

add_executable(app main.cpp)
target_link_libraries(app PRIVATE Foo)

Foo 上的 INTERFACE_LINK_LIBRARIES_DIRECT 目标属性告诉 CMake 假装 app 也直接链接到 FooPlugin。Foo 上的 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 目标属性告诉 CMake 假装 app没有直接链接到 Foo。相反,Foo 将作为 FooPlugin 的依赖项链接。 app 的最终链接行将按以下顺序链接库

  • FooPlugin 作为 app 的直接链接依赖项(通过 Foo 的用法要求)。

  • FooExtras 作为 FooPlugin 的依赖项。

  • Foo 作为 FooPlugin 和 FooExtras 的依赖项。

  • Core 作为 FooPlugin、FooExtras 和 Foo 的依赖项。

请注意,如果没有 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 目标属性,Foo 将被链接两次:一次作为 app 的直接依赖项,一次作为 FooPlugin 的依赖项。

示例:选择加入静态插件¶

在上面的 示例:静态插件 中,app 可执行文件指定它直接链接到 Foo。在实际应用程序中,可能存在中间库

add_library(app_impl STATIC app_impl.cpp)
target_link_libraries(app_impl PRIVATE Foo)

add_executable(app main.cpp)
target_link_libraries(app PRIVATE app_impl)

在这种情况下,我们不希望 Foo 的 INTERFACE_LINK_LIBRARIES_DIRECT 和 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 目标属性影响 app_impl 的直接依赖项。为避免这种情况,我们可以修改属性值以使其效果可选择加入

# An app that links Foo should link Foo's plugin directly.
set_property(TARGET Foo PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT
  "$<$<BOOL:$<TARGET_PROPERTY:FOO_STATIC_PLUGINS>>:FooPlugin>"
)

# An app does not need to link Foo directly because the plugin links it.
set_property(TARGET Foo PROPERTY INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE
  "$<$<BOOL:$<TARGET_PROPERTY:FOO_STATIC_PLUGINS>>:Foo>"
)

现在,app 可执行文件可以选择加入以获取 Foo 的插件

set_property(TARGET app PROPERTY FOO_STATIC_PLUGINS 1)

app 的最终链接行现在将按以下顺序链接库

  • FooPlugin 作为 app 的直接链接依赖项(通过 Foo 的用法要求)。

  • app_impl 作为 app 的直接链接依赖项。

  • FooExtras 作为 FooPlugin 的依赖项。

  • Foo 作为 app_impl、FooPlugin 和 FooExtras 的依赖项。

  • Core 作为 FooPlugin、FooExtras 和 Foo 的依赖项。

目录

  • INTERFACE_LINK_LIBRARIES_DIRECT
    • 作为用法要求的直接链接依赖项
    • 直接链接依赖项排序
    • 示例:静态插件
    • 示例:选择加入静态插件

上一主题

INTERFACE_LINK_LIBRARIES

下一主题

INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE

本页

  • 显示源代码

快速搜索

导航

  • 索引
  • 下一个 |
  • 上一个 |
  • CMake 4.0.0 »
  • 文档 »
  • cmake-properties(7) »
  • INTERFACE_LINK_LIBRARIES_DIRECT
© Copyright 2000-2025 Kitware, Inc. and Contributors. 使用 Sphinx 7.3.7 创建。