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