Spec-Zone.ru › CMake 3.8

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

Примечание

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

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

Spec-Zone.ru

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