Spec-Zone.ru › CMake 3.16

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

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

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

Примечание

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

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

Spec-Zone.ru

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