LINK_LIBRARIES_STRATEGY¶
在版本 3.31 中添加。
指定在链接器命令行上排列目标直接链接依赖项的策略。此属性由 CMAKE_LINK_LIBRARIES_STRATEGY
变量的值初始化,如果该变量在创建目标时已设置。
CMake 使用目标的 目标链接属性 生成其链接行。特别是,LINK_LIBRARIES
目标属性记录了目标的直接链接依赖项,通常通过调用 target_link_libraries()
来填充。间接链接依赖项从 LINK_LIBRARIES
中命名库目标的条目传播,通过遵循其 INTERFACE_LINK_LIBRARIES
属性的传递闭包。CMake 支持多种策略来名义上排序直接和间接链接依赖项,然后针对 工具链特定行为 进行过滤。
考虑以下策略的示例
add_library(A STATIC ...)
add_library(B STATIC ...)
add_library(C STATIC ...)
add_executable(main ...)
target_link_libraries(B PRIVATE A)
target_link_libraries(C PRIVATE A)
target_link_libraries(main PRIVATE A B C)
支持的策略有
REORDER_MINIMALLY
LINK_LIBRARIES
的条目始终首先出现并保持其原始顺序。通过原始条目未满足的间接链接依赖项可能会相互重新排序和去重,但始终附加在原始条目之后。这可能会导致链接行效率较低,但允许项目控制独立条目之间的顺序。当链接标志与库混合使用时,或者当多个库提供给定符号时,这种控制可能很重要。这是默认值。
在上述示例中,此策略通过从其原始条目
A B C
开始,然后附加另一个A
来满足B
和C
对A
的依赖项,从而计算main
的链接行。此策略生成的名义顺序是A B C A
。请注意,针对 工具链特定行为 的额外过滤可能会在生成的构建系统中实际的链接器调用中对
A
进行去重,从而产生A B C
或B C A
。REORDER_FREELY
LINK_LIBRARIES
的条目可以重新排序、去重并与间接链接依赖项混合。这可能会导致链接行效率更高,但不会给项目提供对独立条目之间顺序的任何控制。在上述示例中,此策略通过重新排序其原始条目
A B C
来满足B
和C
对A
的依赖项,从而计算main
的链接行。此策略生成的名义顺序是B C A
。
工具链特定行为¶
在上述策略之一在直接和间接链接依赖项之间生成名义顺序后,生成的构建系统中实际的链接器调用可能会根据平台特定要求和链接器功能去重条目。请参阅策略 CMP0156
。
例如,如果 REORDER_MINIMALLY
策略生成 A B C A
,实际的链接行可能会按如下方式去重 A
如果
A
是静态库且链接器自动重新扫描,则保留第一次出现,结果为A B C
。请参阅策略CMP0179
如果
A
是 Windows 上的共享库,则保留第一次出现,结果为A B C
。如果
A
是 macOS 或 UNIX 平台上的共享库,则保留最后一次出现,结果为B C A
。