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