CMP0003
Библиотеки, связанные по полному пути, больше не генерируют пути поиска компоновщика.
Этот параметр влияет на то, как библиотеки, полные пути к которым НЕ известны, находятся во время компоновки, но он был создан из-за изменения в том, как CMake обрабатывает библиотеки, полные пути к которым известны. Рассмотрим код
target_link_libraries(myexe /path/to/libA.so)
CMake 2.4 и ниже реализовывали связывание с библиотеками, полные пути к которым были известны, разделяя их на строке компоновки на отдельные компоненты, состоящие из пути поиска компоновщика и имени библиотеки. Пример кода мог создать что-то вроде
... -L/path/to -lA ...
для связи с библиотекой А. Был проведен анализ, чтобы упорядочить несколько каталогов связывания таким образом, чтобы компоновщик нашел библиотеку А в нужном месте, но есть случаи, когда это не работает. Версии 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.15.7 выдает предупреждение, когда параметр не установлен, и использует 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.15/policy/CMP0003.html