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_MINIMALLYLINK_LIBRARIES的条目始终首先出现,并保持其原始顺序。未被原始条目满足的间接链接依赖项可能会相对于彼此重新排序和去重,但始终附加在原始条目之后。这可能会导致链接行效率较低,但项目可以控制独立条目之间的排序。当混合链接标志和库时,或者当多个库提供给定符号时,这种控制可能很重要。这是默认设置。
在上面的示例中,此策略通过以其原始条目
A B C开头来计算main的链接行,然后附加另一个A来满足B和C对A的依赖。此策略产生的名义顺序为A B C A。请注意,对 工具链特定行为 的额外过滤可能会在生成的构建系统中实际调用链接器时对
A进行去重,从而生成A B C或B C A。REORDER_FREELYLINK_LIBRARIES的条目可以重新排序、去重并与间接链接依赖项混合。这可能会产生更有效的链接行,但不会让项目对独立条目之间的排序进行任何控制。在上面的示例中,此策略通过重新排序其原始条目
A B C来计算main的链接行,以满足B和C对A的依赖。此策略产生的名义顺序为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。