Spec-Zone.ru › CMake 3.20

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.20.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.20/policy/CMP0060.html

Spec-Zone.ru

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