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