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