Spec-Zone.ru › CMake 3.28

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.28.6 не выводит предупреждение по умолчанию, когда эта политика не установлена, и просто использует поведение 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.28/policy/CMP0060.html

Spec-Zone.ru

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