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 行为。

注意

某个策略的 行为 默认 已被 弃用,并且可能在将来的 CMake 版本中被移除。