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 版本中被移除。