Spec-Zone.ru › CMake 3.27

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 библиотечный целевой объект с его свойством 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.27.9 по умолчанию не предупреждает, если эта политика не установлена, и просто использует поведение OLD. См. документацию переменной CMAKE_POLICY_WARNING_CMP0060 для управления предупреждением.

Примечание

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

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

Spec-Zone.ru

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