Spec-Zone.ru › CMake 3.26

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.26.0-rc3 предупреждает, когда параметр не установлен, и использует OLD поведение. Используйте команду cmake_policy(), чтобы установить его в OLD или NEW явно.

Примечание

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

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

Spec-Zone.ru

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