Spec-Zone.ru › CMake 3.17

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

Примечание

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

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

Spec-Zone.ru

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