Spec-Zone.ru › CMake 3.5

CMP0060

Связывать библиотеки полными путями даже в неявных каталогах.

Политика 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 обеспечивает совместимость для существующих проектов.

Старое поведение для этой политики — попросить компоновщик найти библиотеки, полные пути которых известны как находящиеся в неявных каталогах компоновки. Новое поведение для этой политики — связывать библиотеки полными путями, даже если они находятся в неявных каталогах компоновки.

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

Примечание

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

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

Spec-Zone.ru

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