Spec-Zone.ru › CMake 3.25

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.25.1 предупреждает, когда параметр не установлен, и использует 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.25/policy/CMP0003.html

Spec-Zone.ru

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