Spec-Zone.ru › CMake 3.9

CMP0060

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

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

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

Эта политика была введена в версии CMake 3.3. В отличие от большинства политик, CMake версии 3.9.6 не предупреждает по умолчанию, когда эта политика не установлена, и просто использует старое поведение. См. документацию переменной 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.9/policy/CMP0060.html

Spec-Zone.ru

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