Spec-Zone.ru › CMake 3.31

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_policy() или cmake_minimum_required(). Если он не настроен, CMake выводит предупреждение и использует поведение OLD.

Примечание

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

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

Spec-Zone.ru

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