Spec-Zone.ru › CMake 3.28

CMP0003

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

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

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

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

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

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

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

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

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

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

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

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

что позволит найти библиотеку Б, как и раньше. При установке политики в 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)

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

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

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

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

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

Примечание

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

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

Spec-Zone.ru

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