Spec-Zone.ru › CMake

CMP0060

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

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

Добавлено в версии 3.3.

Связывать библиотеки по полному пути даже в неявных каталогах.

Политика CMP0003 была введена с намерением всегда связывать файлы библиотек по полному пути, если команде target_link_libraries() передан полный путь. Однако на некоторых платформах (например, HP-UX) интерфейсная часть компилятора добавляет альтернативные пути поиска библиотек для текущей архитектуры (например, у /usr/lib/<arch> есть альтернативы библиотекам в /usr/lib для текущей архитектуры). На таких платформах команда find_library() может найти библиотеку, например /usr/lib/libfoo.so, которая не принадлежит текущей архитектуре.

До появления политики CMP0003 проекты в таких случаях всё равно собирались, поскольку неправильный путь к библиотеке преобразовывался в -lfoo в командной строке компоновщика, и компоновщик находил нужную библиотеку в пути поиска для конкретной архитектуры, неявно предоставленном интерфейсной частью компилятора. В то время мы решили сохранить совместимость с такими проектами, всегда преобразуя файлы библиотек, найденные в неявных каталогах компоновки, во флаги -lfoo, чтобы компоновщик искал их самостоятельно. Такой подход позволил существующим проектам продолжить сборку, сохраняя возможность связывать библиотеки за пределами неявных каталогов компоновки по полному пути (например, библиотеки из дерева сборки).

CMake позволяет проектам переопределить такое поведение, используя импортированную цель библиотеки со свойством IMPORTED_LOCATION, установленным в нужный полный путь к файлу библиотеки. На самом деле многие модули Find учатся предоставлять импортированные цели вместо одних лишь традиционных переменных Foo_LIBRARIES со списком файлов библиотек. Однако из-за этого командная строка компоновщика, создаваемая для библиотеки, найденной модулем Find, зависит от того, связывается ли она через импортированную цель, что непоследовательно. Кроме того, такое поведение вызывало путаницу, поскольку создаваемая командная строка компоновщика для файла библиотеки зависит от его расположения. Это также проблематично для проектов, пытающихся выполнить статическую компоновку: для помощи компоновщику в выборе libfoo.a вместо libfoo.so могут использоваться такие флаги, как -Wl,-Bstatic -lfoo -Wl,-Bdynamic, но тогда динамическая компоновка распространяется на следующие библиотеки. (Решение, обычно используемое для этой проблемы, см. в описании свойства цели LINK_SEARCH_END_STATIC.)

Когда впервые появилось особое правило для библиотек в неявных каталогах компоновки, список таких каталогов был просто жёстко задан (например, /lib, /usr/lib и некоторые другие). С тех пор CMake научился определять неявные каталоги компоновки, используемые интерфейсной частью компилятора. При необходимости команду find_library() можно научить использовать эти сведения, чтобы помогать находить библиотеки нужной архитектуры.

По этим причинам в CMake 3.3 и более поздних версиях предпочтительно отказаться от особого правила и связывать библиотеки по полному пути, даже если они находятся в неявных каталогах компоновки. Политика CMP0060 обеспечивает совместимость с существующими проектами.

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

Эта политика была введена в CMake версии 3.3. До её удаления в CMake версии 4.0 её можно было установить с помощью cmake_policy() или cmake_minimum_required(). Если она не была установлена, CMake по умолчанию не выдавал предупреждение и использовал поведение OLD.

См. документацию переменной CMAKE_POLICY_WARNING_CMP0060, управляющей предупреждениями в версиях CMake до 4.0.

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

Spec-Zone.ru

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