CMP0003
Библиотеки, связанные по полному пути, больше не генерируют пути поиска для компоновщика.
Этот политический параметр затрагивает, как находятся библиотеки, чьи полные пути НЕ известны, во время компоновки, но был создан из-за изменения в том, как CMake обрабатывает библиотеки с известными полными путями. Рассмотрим код
target_link_libraries(myexe /path/to/libA.so)
CMake 2.4 и ниже реализовывали связывание с библиотеками, чьи полные пути были известны, разделяя их в строке компоновки на отдельные компоненты, состоящие из пути поиска компоновщика и имени библиотеки. Пример кода мог привести к чему-то вроде
... -L/path/to -lA ...
для связывания с библиотекой А. Была проведена оценка порядка нескольких каталогов с путями поиска компоновщика таким образом, чтобы компоновщик нашел библиотеку А в нужном месте, но есть случаи, когда это не работает. Версии CMake 2.6 и выше в большинстве случаев используют более надежный подход, передавая полный путь к библиотекам непосредственно компоновщику. Пример кода теперь приводит к чему-то вроде
... /path/to/libA.so ....
К сожалению, это изменение может сломать код вроде
target_link_libraries(myexe /path/to/libA.so B)
где B предназначено для поиска /path/to/libB.so. Этот код неверен, потому что пользователь просит компоновщик найти библиотеку B, но не предоставил путь поиска компоновщика (который можно добавить с помощью команды link_directories). Однако, с предыдущей реализацией связывания код работал случайно, потому что путь поиска компоновщика, добавленный для библиотеки А, позволял найти библиотеку B.
Для поддержки проектов, зависящих от путей поиска компоновщика, добавленных связыванием с библиотеками с известными полными путями, поведение OLD для этого параметра будет добавлять пути поиска компоновщика, даже если они не нужны для собственных библиотек. Когда этот политический параметр установлен на OLD, CMake сгенерирует строку компоновки, такую как
... -L/path/to /path/to/libA.so -lB ...
что позволит найти библиотеку B, как это было раньше. Когда этот параметр установлен на NEW, CMake сгенерирует строку компоновки, такую как
... /path/to/libA.so -lB ...
что более точно соответствует тому, что указал проект.
Настройка этого параметра, используемая при генерации строки компоновки, заключается в том, что когда целевой объект создается командой add_executable или add_library. Для описанного выше примера код
cmake_policy(SET CMP0003 OLD) # or cmake_policy(VERSION 2.4) add_executable(myexe myexe.c) target_link_libraries(myexe /path/to/libA.so B)
будет работать и подавит предупреждение для этого параметра. Он также может быть обновлен для работы с исправленным подходом связывания:
cmake_policy(SET CMP0003 NEW) # or cmake_policy(VERSION 2.6) link_directories(/path/to) # needed to find library B add_executable(myexe myexe.c) target_link_libraries(myexe /path/to/libA.so B)
Еще лучше, библиотеку B можно указать с полным путем:
add_executable(myexe myexe.c) target_link_libraries(myexe /path/to/libA.so /path/to/libB.so)
Когда все элементы в строке компоновки имеют известные пути, CMake не проверяет этот параметр, поэтому он не оказывает влияния.
Обратите внимание, что предупреждение для этого параметра будет выведено не более чем для одного целевого объекта. Это предотвращает затопление пользователей сообщениями для каждого целевого объекта, когда установка параметра, скорее всего, исправит все целевые объекты.
Этот параметр был введен в версии CMake 2.6.0. Версия CMake 3.19.0-rc3 предупреждает, когда параметр не установлен, и использует OLD поведение. Используйте команду cmake_policy(), чтобы установить его на OLD или NEW явно.
Примечание
Поведение OLD параметра deprecated by definition и может быть удалено в будущей версии CMake.
© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.19/policy/CMP0003.html