Spec-Zone.ru › CMake 3.14

CMP0060

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

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

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

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

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

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

СТАРОЕ поведение для этой политики — попросить компоновщик поискать библиотеки, чьи полные пути известны как находящиеся в неявных каталогах связывания. НОВОЕ поведение для этой политики — связывать библиотеки полным путем, даже если они находятся в неявных каталогах связывания.

Эта политика была введена в версии CMake 3.3. В отличие от большинства политик, версия CMake 3.14.7 по умолчанию не предупреждает, если эта политика не установлена, и просто использует старое поведение. См. документацию переменной CMAKE_POLICY_WARNING_CMP0060 для управления предупреждением.

Примечание

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

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

Spec-Zone.ru

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