cmake включает в себя только библиотеку заголовков
Я хочу включить spdlog в один из моих проектов. Это библиотека только для заголовков. Проект, который я строю, использует cmake. В настоящее время я использую
include_directories('src/logger/spdlog/')
в Cmake и в том числе в библиотеке
#include <spdlog/spdlog.h>
в logs.h внутри папки логгера. Я получаю фатальную ошибку, нет такого файла или каталога. Как правильно включить ту же библиотеку в моем приложении.
3 ответа
Во-первых, не используйте одинарные кавычки '
но двойные кавычки "
или просто строки, если они не содержат пробелов.
Я бы посоветовал вам использовать find_path
вместо добавления включает напрямую. Там вы можете добавить PATH_SUFFIXES
, Во время настройки вы получаете сообщение, если заголовок не найден, что облегчает обнаружение ошибок.
Документация: https://cmake.org/cmake/help/v3.6/command/find_path.html
Cmake предоставляет библиотеку интерфейса специально для «библиотеки только для заголовков». Я бы предложил сделать следующее:
- Создайте файловую структуру, подобную следующей
third-party\spdlog\include
- Git клонирует репозиторий spdlog в
include
каталог с названиемspdlog
- Создавать
third-party\spdlog\CMakeLists.txt
со следующим содержанием
find_package(Threads REQUIRED)
add_library(${TARGET_LOGGER} INTERFACE)
# add_library(spdlog::spdlog_header_only ALIAS ${TARGET_LOGGER})
target_include_directories(${TARGET_LOGGER} INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
target_link_libraries(${TARGET_LOGGER} INTERFACE Threads::Threads)
- Определите TARGET_LOGGER в CMakeLists.txt вашего проекта. Свяжите эту цель с вашим проектом с помощью
target_link_libraries(${TARGET_PROJECT} LINK_PUBLIC ${TARGET_LOGGER})
. Также не забудьте
add_subdirectory(
third-party\spdlog
)
Затем в своем проекте вы можете использовать
#include "spdlog/spdlog.h"
включить библиотеку
Вы, вероятно, не в одном каталоге. Попробуйте либо
include_directories("src/logger")
в CMakeLists.txt
, или же
#include <spdlog.h>
в исходном коде.