Я пытаюсь интегрировать 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_directories("libs/")
Теперь, когда я пытаюсь написать #include <spdlog/spdlog.h>
в заголовочном файле, расположенном в src/
CLion жалуется, что не может найти spdlog.h
хотя я проверил и файл определенно находится в spdlog
папка. Использование кавычек вместо угловых скобок в операторе включения не решает проблему, однако использование пути относительно файла (например, ../libs/spdlog/spdlog.h
) работает как надо. Что меня больше смущает, так это то, что в исходном файле, соответствующем заголовку, я могу включить файл без проблем.
Мне нигде не удалось найти ничего похожего на эту проблему, и я изо всех сил пытаюсь понять, что заставляет CMake или CLion вести себя так.
РЕДАКТИРОВАТЬ: В соответствии с предложением Матье Брухера я пытался использовать полные пути к папке включения, но она все еще не работает. Кажется, проблема в том, что папки не распознаются в заголовках, так как они работают в исходных файлах.
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)
РЕДАКТИРОВАТЬ 3: Когда я попытался воссоздать ошибку, чтобы показать полное сообщение, заданное каким-то образом, оно ушло, заменив его другим, совершенно не связанным с CMake …
Вы можете использовать полные пути:
include_directories(${CMAKE_SOURCE_DIR}/libs/)
Вы также должны добавить папку для включения в пути для включения, чтобы иметь возможность включить через #include <spdlog/spdlog.h>
, Это должно выглядеть так
include_directories(${CMAKE_SOURCE_DIR}/libs)
Но я предпочитаю использовать
target_include_directories(yourTarget PUBLIC ${CMAKE_SOURCE_DIR}/libs)
где yourTarget
является целью, где вы хотите использовать spdlog. Например, у вас также будут доступны каталоги включения, если вы собираетесь связать свой yourTarget
к чему-то еще. Если вам нужен spdlog только в yourTarget
SCP файлы, которые вы можете изменить PUBLIC
в PRIVATE
, Увидеть cmake doc.