Spec-Zone.ru › CMake 3.24

CMP0003

Библиотеки, связанные по полному пути, больше не генерируют пути поиска компоновщика.

Этот параметр влияет на то, как обнаруживаются при компоновке библиотеки, полные пути которых НЕ известны, но был создан из-за изменения в том, как CMake обрабатывает библиотеки, полные пути которых известны. Рассмотрим код

target_link_libraries(myexe /path/to/libA.so)

CMake 2.4 и ниже реализовывали привязку к библиотекам, полные пути которых были известны, разделяя их на строке компоновки на отдельные компоненты, состоящие из пути поиска компоновщика и имени библиотеки. Пример кода мог привести к чему-то вроде

... -L/path/to -lA ...

для связи с библиотекой A. Был проведен анализ, чтобы упорядочить несколько каталогов поиска компоновщика таким образом, чтобы компоновщик находил библиотеку A в нужном месте, но есть случаи, когда это не работает. В версиях CMake 2.6 и выше используется более надёжный подход, заключающийся в передаче полного пути к библиотекам непосредственно компоновщику в большинстве случаев. Пример кода теперь приводит к чему-то вроде

... /path/to/libA.so ....

К сожалению, это изменение может нарушить код, подобный

target_link_libraries(myexe /path/to/libA.so B)

где B предназначен для поиска /path/to/libB.so. Этот код неправильный, потому что пользователь просит компоновщик найти библиотеку B, но не предоставляет путь поиска компоновщика (который может быть добавлен с помощью команды link_directories). Однако, с предыдущей реализацией компоновки код работал случайно, потому что путь поиска компоновщика, добавленный для библиотеки A, позволял найти библиотеку B.

Для поддержки проектов, зависящих от путей поиска компоновщика, добавленных при связывании с библиотеками, полные пути которых известны, поведение OLD для этого параметра будет добавлять пути поиска компоновщика, даже если они не нужны для собственных библиотек. Когда этот параметр установлен в OLD, CMake будет генерировать строку компоновки, такую как

... -L/path/to /path/to/libA.so -lB ...

что позволит найти библиотеку B, как и раньше. Когда этот параметр установлен в NEW, CMake сгенерирует строку компоновки, такую как

... /path/to/libA.so -lB ...

что более точно соответствует тому, что указал проект.

Настройка этого параметра, используемая при генерации строки компоновки, фактически заключается в том, что когда целевой объект создаётся командами add_executable или add_library. Для описанного выше примера код

cmake_policy(SET CMP0003 OLD) # or cmake_policy(VERSION 2.4)
add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so B)

будет работать и подавит предупреждение для этого параметра. Он также может быть обновлён для работы с исправленным подходом компоновки:

cmake_policy(SET CMP0003 NEW) # or cmake_policy(VERSION 2.6)
link_directories(/path/to) # needed to find library B
add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so B)

Ещё лучше, библиотека B может быть указана с полным путём:

add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so /path/to/libB.so)

Если все элементы в строке компоновки имеют известные пути, CMake не проверяет этот параметр, поэтому он не оказывает никакого влияния.

Обратите внимание, что предупреждение для этого параметра будет выведено не более чем для одного целевого объекта. Это предотвращает затопление пользователей сообщениями для каждого целевого объекта, когда установка параметра, вероятно, исправит все целевые объекты.

Этот параметр был введён в CMake версии 2.6.0. CMake версии 3.24.2 предупреждает, когда параметр не установлен, и использует OLD поведение. Используйте команду cmake_policy() для явного задания ему значения OLD или NEW.

Примечание

Поведение OLD параметра deprecated by definition и может быть удалено в будущих версиях CMake.

© 2000–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.24/policy/CMP0003.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API