CMP0156¶
在版本 3.29 中添加。
根据链接器能力对链接行中的库进行去重。
传统的链接器在链接过程中会维护一组未定义符号。链接器按照命令行中出现的顺序处理每个文件,直到未定义符号集合变为空。当遇到目标文件时,该文件会被链接到输出目标中,其未定义符号会被添加到集合中。当遇到归档文件(archive file)时,传统链接器会搜索其中包含的目标文件,并处理那些能满足未解析符号集合中需求的文件。
在使用传统链接器时,处理相互依赖的归档文件可能会很麻烦。归档文件可能需要被多次指定。
某些链接器(例如 Apple 或 Windows 链接器,以及 LLVM LLD)在遍历命令行参数时会记录在目标文件和归档文件中找到的所有符号。当这些链接器遇到一个可以通过先前处理过的归档文件中的目标文件来解析的未定义符号时,它会立即提取该目标文件并将其链接到输出目标中。
CMake 3.28 及以下版本可能会生成重复静态库的链接行,就像传统链接器所需要的那样,即使在使用不需要这样做的链接器时也是如此。它们还可能通过保留共享库的最后一次出现来对其进行去重,这在 Windows 平台上可能会改变 DLL 的加载顺序。
CMake 3.29 及以上版本倾向于根据链接器的能力应用不同的策略。因此,在针对 Apple 和 Windows 平台时,所有库都会进行去重。此外,在 Windows 平台上,库通过保留其第一次出现的位置进行去重,从而遵循项目指定的顺序。此策略为尚未更新以适应后一种行为的项目提供了兼容性。
注意
当此策略设置为 NEW 时,策略 CMP0179 将控制在对静态库进行去重时保留哪一次出现。
此策略的 OLD 行为是始终重复静态库,就像使用传统链接器一样,并且始终通过保留每个共享库的最后一次出现来对其进行去重。此策略的 NEW 行为是根据链接器的能力应用不同的策略。
此策略在 CMake 版本 3.29 中引入。它可以由 cmake_policy() 或 cmake_minimum_required() 设置。如果未设置,CMake 不会发出警告,并使用 OLD 行为。
注意
策略的 OLD 行为根据定义已被弃用,并可能在未来版本的 CMake 中被移除。