CMP0003
Библиотеки, связанные по полному пути, больше не генерируют пути поиска компоновщика.
Этот политический параметр влияет на то, как находятся библиотеки, полные пути которых НЕ известны, во время компоновки, но был создан из-за изменения в том, как CMake обрабатывает библиотеки, полные пути которых известны. Рассмотрим код
target_link_libraries(myexe /path/to/libA.so)
CMake 2.4 и ниже реализовывали связывание с библиотеками, полные пути к которым были известны, разбивая их на строке компоновки на отдельные компоненты, состоящие из пути поиска компоновщика и имени библиотеки. Примерный код мог привести к чему-то вроде
... -L/path/to -lA ...
для связывания с библиотекой A. Был проведен анализ для упорядочения нескольких каталогов компоновки таким образом, чтобы компоновщик находил библиотеку A в нужном месте, но в некоторых случаях это не работает. Версии CMake 2.6 и выше используют более надежный подход, передавая полный путь к библиотекам напрямую компоновщику в большинстве случаев. Примерный код теперь выглядит примерно так
... /path/to/libA.so ....
К сожалению, это изменение может нарушить код, подобный
target_link_libraries(myexe /path/to/libA.so B)
где «B» предназначен для поиска «/path/to/libB.so». Этот код неправильный, потому что пользователь просит компоновщик найти библиотеку B, но не предоставил путь поиска компоновщика (который может быть добавлен с помощью команды link_directories). Однако, с прежней реализацией компоновки код случайно работал, потому что путь поиска компоновщика, добавленный для библиотеки A, позволял найти библиотеку B.
Для поддержки проектов, зависящих от путей поиска компоновщика, добавленных путем связывания с библиотеками, полные пути которых известны, старое поведение этого политического параметра будет добавлять пути поиска компоновщика, даже если они не нужны для собственных библиотек. При установке этого политического параметра в 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.10.3 предупреждает, когда политический параметр не установлен, и использует старое поведение. Используйте команду cmake_policy, чтобы явно установить его в OLD или NEW.
Примечание
Поведение политического параметра OLD deprecated by definition и может быть удалено в будущей версии CMake.
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.10/policy/CMP0003.html