Spec-Zone.ru › CMake 3.13

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

Spec-Zone.ru

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