Spec-Zone.ru › CMake 3.21

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.21.0-rc3 предупреждает, когда политика не установлена, и использует OLD поведение. Используйте команду cmake_policy(), чтобы установить её в OLD или NEW явно.

Примечание

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

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

Spec-Zone.ru

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