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