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). Однако, со старой реализацией компоновки код работал случайно, потому что путь поиска компоновщика, добавленный для библиотеки А, позволял найти библиотеку 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.5.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.5/policy/CMP0003.html