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
。