СТРАТЕГИЯ_СВЯЗАННЫХ_БИБЛИОТЕК
Добавлен в версии 3.31.
Укажите стратегию упорядочивания прямых зависимостей целевых библиотек от библиотек линковщика в командной строке линковщика. Это свойство инициализируется значением переменной CMAKE_LINK_LIBRARIES_STRATEGY, если она установлена при создании целевого объекта.
CMake генерирует строку линковки целевого объекта, используя его Свойства линковки целевого объекта. В частности, свойство целевого объекта LINK_LIBRARIES записывает прямые зависимости целевого объекта от библиотек, как правило, заполняемые вызовами target_link_libraries(). Косвенные зависимости от библиотек распространяются из тех записей в LINK_LIBRARIES, которые имеют имена целевых библиотек, следуя транзитивному замыканию их свойств INTERFACE_LINK_LIBRARIES. CMake поддерживает несколько стратегий для номинального упорядочивания прямых и косвенных зависимостей от библиотек, которые затем фильтруются для Платформенно-специфического поведения.
Рассмотрим этот пример для стратегий ниже:
add_library(A STATIC ...) add_library(B STATIC ...) add_library(C STATIC ...) add_executable(main ...) target_link_libraries(B PRIVATE A) target_link_libraries(C PRIVATE A) target_link_libraries(main PRIVATE A B C)
Поддерживаемые стратегии:
-
REORDER_MINIMALLY -
Записи в
LINK_LIBRARIESвсегда появляются первыми и в их исходном порядке. Косвенные зависимости от библиотек, не удовлетворяемые исходными записями, могут быть переупорядочены и устранены дублирование относительно друг друга, но всегда добавляются после исходных записей. Это может привести к менее эффективным строкам линковки, но предоставляет проектам контроль над порядком среди независимых записей. Такой контроль может быть важен при смешивании флагов линковки с библиотеками или когда несколько библиотек предоставляют один и тот же символ.Это значение по умолчанию.
В приведенном выше примере эта стратегия вычисляет строку линковки для
main, начиная с ее исходных записейA B C, а затем добавляет другуюA, чтобы удовлетворить зависимостиBиCотA. Номинальный порядок, созданный этой стратегией, —A B C A.Обратите внимание, что дополнительная фильтрация для Платформенно-специфического поведения может устранить дублирование
Aв фактическом вызове линковщика в сгенерированной системе сборки, что приводит либо кA B C, либо кB C A. -
REORDER_FREELY -
Записи в
LINK_LIBRARIESмогут быть переупорядочены, дублирование может быть устранено, и они могут быть перемешаны с косвенными зависимостями от библиотек. Это может привести к более эффективным строкам линковки, но не дает проектам никакого контроля над порядком среди независимых записей.В приведенном выше примере эта стратегия вычисляет строку линковки для
mainпутем переупорядочивания ее исходных записейA B Cдля удовлетворения зависимостейBиCотA. Номинальный порядок, созданный этой стратегией, —B C A.
Платформенно-специфическое поведение
После того как одна из вышеуказанных стратегий создаст номинальный порядок среди прямых и косвенных зависимостей от библиотек, фактический вызов линковщика в сгенерированной системе сборки может устранить дублирование записей на основе требований, специфичных для платформы, и возможностей линковщика. См. политику CMP0156.
Например, если стратегия REORDER_MINIMALLY генерирует A B C A, фактическая строка линковки может устранить дублирование A следующим образом:
- Если
Aявляется статической библиотекой, и линковщик автоматически повторно сканирует, то сохраняется первое вхождение, что приводит кA B C. См. политикуCMP0179 - Если
Aявляется динамической библиотекой в Windows, сохраняется первое вхождение, что приводит кA B C. - Если
Aявляется динамической библиотекой на платформах macOS или UNIX, сохраняется последнее вхождение, что приводит кB C A.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/prop_tgt/LINK_LIBRARIES_STRATEGY.html