LINK_LIBRARIES_STRATEGY¶
在版本 3.31 中添加。
指定一种策略,用于在链接器命令行中对目标的直接链接依赖项进行排序。如果在创建目标时设置了此属性,则此属性将由 CMAKE_LINK_LIBRARIES_STRATEGY
变量的值进行初始化。
CMake 使用其 Target Link Properties 生成目标的链接行。具体而言,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
来为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
。