Spec-Zone.ru › CMake 3.23

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. Этот код неверный, потому что пользователь просит компоновщик найти библиотеку Б, но не предоставил путь поиска компоновщика (который можно добавить командой link_directories). Однако, при старой реализации компоновки код мог работать случайно, потому что путь поиска компоновщика, добавленный для библиотеки А, позволял найти библиотеку Б.

Для поддержки проектов, зависящих от путей поиска компоновщика, добавленных путём связывания с библиотеками, чьи полные пути известны, поведение OLD для этого параметра будет добавлять пути поиска компоновщика, даже если они не нужны для собственных библиотек. Когда этот параметр установлен в OLD, CMake сгенерирует строку компоновки, такую как

... -L/path/to /path/to/libA.so -lB ...

что позволит найти библиотеку Б, как и раньше. Когда этот параметр установлен в 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)

Ещё лучше, библиотеку Б можно указать с полным путём:

add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so /path/to/libB.so)

Когда все элементы в строке компоновки имеют известные пути, CMake не проверяет этот параметр, поэтому он не оказывает никакого влияния.

Обратите внимание, что предупреждение для этого параметра будет выведено не более чем для одного целевого объекта. Это предотвращает затопление пользователей сообщениями для каждого целевого объекта, поскольку установка параметра один раз, вероятно, исправит все целевые объекты.

Этот параметр был введён в версии CMake 2.6.0. CMake версии 3.23.3 выводит предупреждение, если параметр не задан, и использует OLD поведение. Используйте команду cmake_policy(), чтобы явно установить его в OLD или NEW.

Примечание

Поведение OLD параметра deprecated by definition и может быть удалено в будущей версии CMake.

© 2000–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/policy/CMP0003.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API