Spec-Zone.ru › CMake 3.21

CMP0060

Новое в версии 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, установленным на желаемый полный путь к файлу библиотеки. На самом деле, многие модули поиска учатся предоставлять импортированные целевые объекты вместо просто традиционной переменной 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 обеспечивает совместимость для существующих проектов.

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

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

Примечание

Поведение 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/CMP0060.html

Spec-Zone.ru

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