В настоящее время я разрабатываю программный пакет, для которого я хотел бы предоставить поддержку пакета cmake (чтобы пользователи могли найти его с помощью find_package(...)
). Проблема в том, что пакет найден, но FOO_INCLUDE_DIR
и FOO_LIBRARIES
пуст.
В моем пакете у меня есть несколько модулей, каждый с файлом CMakeLists, который устанавливает соответствующую библиотеку и заголовки с:
install(TARGETS ${LIBRARY_NAME} EXPORT FooTargets
RUNTIME DESTINATION ${Foo_RUNTIME_INSTALL_DIR}
LIBRARY DESTINATION ${Foo_LIBRARY_INSTALL_DIR}
ARCHIVE DESTINATION ${Foo_ARCHIVE_INSTALL_DIR}
FRAMEWORK DESTINATION ${Foo_FRAMEWORK_INSTALL_DIR})
# Headers
install(
DIRECTORY include/${LIBRARY_NAME}
DESTINATION include/${PROJECT_NAME}
FILES_MATCHING
PATTERN "*.h"
PATTERN "*.hpp"
)
Заголовки для библиотеки включены в target_include_directories следующим образом:
target_include_directories(${LIBRARY_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> # for headers when building
$<INSTALL_INTERFACE:${Foo_INC_INSTALL_DIR}> # for client in install mode
)
Я проверил папки, и все библиотеки и заголовки установлены правильно. В моих списках верхнего уровня CMakeLists я экспортирую свои цели с помощью:
install(
EXPORT FooTargets
DESTINATION ${Foo_CMAKE_CONFIG_INSTALL_DIR}
FILE FooConfig.cmake
)
Конфигурация находится там, где я предполагаю (usr/local/lib/cmake/Foo
). Так что вроде все правильно. Когда я смотрю в свой FooConfig.cmake
, он говорит:
# Create imported target realm_densifier_base
add_library(FooLib1 SHARED IMPORTED)
set_target_properties(FooLib1 PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include/Foo"
INTERFACE_LINK_LIBRARIES "...several libraries..."
)
... что абсолютно правильно и именно то, что я ожидал. Какая часть головоломки отсутствует? INTERFACE_INCLUDE_DIRECTORIES
и INTERFACE_LINK_LIBRARIES
- неправильный флаг для установки?
Спасибо за помощь и всего наилучшего,
Alex
Изменить:
@ Guillaume Racicot уже прояснил большинство вещей, я знал только "нецелевой" способ добавления заголовков в мой проект, который был с include_directories (Foo_INCLUDE_DIRS). Однако в целевом мире ссылки на мою библиотеку Foo было достаточно. Другое дело, что я испортил некоторые каталоги в команде target_include_directories(...)
, поэтому каталоги были неправильными и, следовательно, не могли быть найдены в другом моем проекте. Спасибо за помощь!