spdlog.h не найден в проекте CMake - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь интегрировать spdlog, библиотеку журналов только для заголовков, в проект C ++, но у меня возникают проблемы с тем, чтобы CMake правильно распознал пути включения.Я использую последний CLion с CMake 3.10.2 в Ubuntu 18.04.

Структура моего проекта выглядит следующим образом: Project Dir |- libs | |- spdlog #this is the include directory taken straight from GitHub | |- src | |-... |- CMakeLists.txt В файле CMakeLists.txt я определяю каталог include:
include_directories("libs/")

Теперь, когда я пытаюсь записать #include <spdlog/spdlog.h> в файл заголовка, расположенный в src/, CLion жалуется, что не может найти spdlog.h, даже если я проверил, и файл определенно находится в папке spdlog.Использование кавычек вместо угловых скобок в операторе включения не решает проблему, однако использование пути относительно файла (например, ../libs/spdlog/spdlog.h) работает должным образом.Что меня больше смущает, так это то, что в исходном файле, соответствующем заголовку, я могу включить файл без проблем.

Мне не удалось найти что-либо подобное этому, и я изо всех сил пытаюсь понять,что приводит к тому, что CMake или CLion ведут себя так.

РЕДАКТИРОВАТЬ: В соответствии с предложением Матье Брухера я попытался использовать полные пути к папке include, но он все еще не работает.Кажется, проблема в том, что папки, похоже, не распознаются в заголовках, так как они работают в исходных файлах.

EDIT2: Вот весь CMakeLists.txt, который я использую.Он вложен в каталог, отличный от верхнего уровня CMakeLists.txt для всего проекта, поскольку это было единственное решение, которое я нашел в Интернете, чтобы получить что-то похожее на несколько проектов VS в решении на CLion.Однако, поскольку все пути относительно, я не думаю, что это будет проблемой.Я также знаю, что spdlog - это библиотека C ++ 11, но в ближайшем будущем мне понадобятся некоторые функции C ++ 14.

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)

project(TokenEngine VERSION 0.0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES src/Application.cpp src/Application.hpp src/EntryPoint.hpp src/Logger.cpp src/Logger.hpp)

include_directories("${CMAKE_CURRENT_SOURCE_DIR}/libs/")
add_library(TokenEngine SHARED ${SOURCE_FILES})

#Expose the public API of the engine to any project that might use it
target_include_directories(TokenEngine PUBLIC include)

EDIT3: при попытке воссоздать ошибку, чтобы отобразить полную версиюсообщение, данное каким-то образом, исчезло, его заменили другим, совершенно не связанным с CMake ...

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы также должны добавить папку включения к путям включения, чтобы иметь возможность включать через #include <spdlog/spdlog.h>.Это должно выглядеть как

include_directories(${CMAKE_SOURCE_DIR}/libs)

Но я предпочитаю использовать

target_include_directories(yourTarget PUBLIC ${CMAKE_SOURCE_DIR}/libs)

, где yourTarget - это цель, где вы хотите использовать spdlog.Например, у вас также будут доступны каталоги включения, если вы собираетесь связать свой yourTarget с чем-то другим.Если вам нужен spdlog только в yourTarget s cpp файлах, вы можете изменить PUBLIC на PRIVATE.См. cmake doc .

0 голосов
/ 13 ноября 2018

Вы можете использовать полные пути:

include_directories(${CMAKE_SOURCE_DIR}/libs/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...