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.
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/policy/CMP0156.html