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