CMP0156¶
在版本 3.29 中添加。
基于链接器功能对链接行中的库进行去重。
传统的链接器在链接过程中会维护一个未定义符号的集合。链接器按照命令行的出现顺序处理每个文件,直到未定义符号的集合变为空。当遇到一个对象文件时,它会被链接到输出对象中,其未定义符号会被添加到集合中。当遇到一个归档文件时,传统链接器会搜索其中包含的对象,并处理那些能够满足未解析符号集合的对象。
在使用传统链接器时,处理相互依赖的归档文件可能会很麻烦。归档文件可能需要多次指定。
一些链接器(例如 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 版本中被移除。