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.9.6 выводит предупреждение, когда политика не установлена, и использует старое поведение. Используйте команду 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.9/policy/CMP0003.html