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