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 для этого параметра будет добавлять пути поиска компоновщика, даже если они не нужны для собственных библиотек. Когда этот параметр установлен в 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_policy() или cmake_minimum_required(). Если он не настроен, CMake выдает предупреждение и использует OLD поведение.
Примечание
Поведение OLD параметра deprecated by definition и может быть удалено в будущих версиях CMake.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/policy/CMP0003.html