Spec-Zone.ru › CMake 3.24

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

Примечание

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

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

Spec-Zone.ru

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