Spec-Zone.ru › CMake

CMP0003

Предупреждение

Поведение этой политики OLD было удалено в CMake версии 4.0. Эта политика должна быть установлена в NEW вызовом cmake_minimum_required() или cmake_policy().

Связывание с библиотеками по полному пути больше не приводит к добавлению путей поиска компоновщика.

Эта политика влияет на то, как во время компоновки находятся библиотеки, полные пути к которым НЕ известны, но она была создана из-за изменения способа обработки 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 версии 4.0 её можно было установить с помощью cmake_policy() или cmake_minimum_required(). Если значение не было задано, CMake выдавал предупреждение и использовал поведение OLD.

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

Spec-Zone.ru

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