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