Как лучше всего избежать загрязнения экспортируемых целевых свойств абсолютными путями?
Скрыть абсолютные пути за ИМПОРТИРОВАННОЙ целью:
# Express an external library via IMPORTED target
add_library(lib_external IMPORTED)
set_target_properties(lib_external PROPERTIES
IMPORTED_LOCATION "${XXX_LIBRARY} (some absolute path)"
INTERFACE_INCLUDE_DIRECTORIES "${XXX_INCLUDE_DIRECTORIES} (some absolute path)"
)
# Use external library via the target created
target_link_libraries(my_lib lib_external)
Таким образом, файл конфигурации для my_lib
будет содержать только имя библиотеки IMPORTED, но не ее свойства.
В файле конфигурации вашего проекта вам просто нужно создать цель IMPORTED с с тем же именем и заполните его свойства в соответствии с текущим компьютером (где ваш проект используется ).
find_package
для большинства современных пакетов (включая Boost) уже возвращает IMPORTED target. В файле конфигурации для вашего проекта вы можете использовать find_dependency , который обнаруживает пакет на текущем компьютере и снова создает цель IMPORTED.
Для старых пакетов, find_package
просто возвращает XXX_LIBRARIES
и XXX_INCLUDE_DIRECTORIES
, вы можете создать IMPORTED target вручную . В файле конфигурации для вашего проекта вы также можете использовать find_dependency
и снова создать IMPORTED target вручную .
При использовании макроса find_dependency
не забудьте передать те же параметры , которые вы передали в find_package()
в CMakeLists.txt
проекта. Это первичный параметр COMPONENTS
и такие переменные, как Boost_USE_STATIC_LIBS
, которые влияют на поиск пакетов.
Если вы хотите указать требование VERSION
, тогда это требование должно express двоичная совместимость библиотеки на целевой машине с библиотекой, для которой был создан проект .
HINST
и PATHS
параметры для find_package
вряд ли нужно передавать на find_dependency
: вызов find_dependency
обрабатывается на целевой машине , пути которых могут отличаться от путей на машине сборки .