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.20.0-rc3 предупреждает, если политика не установлена, и использует OLD поведение. Используйте команду cmake_policy(), чтобы установить её в OLD или NEW явно.
Примечание
Поведение OLD политики deprecated by definition и может быть удалено в будущих версиях CMake.
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.20/policy/CMP0003.html