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