1

我正在尝试将 spdlog(仅标头日志库)集成到 C++ 项目中,但我无法让 CMake 正确识别包含路径。我在 Ubuntu 18.04 上使用最新的 CLion 和 CMake 3.10.2。

我的项目结构如下所示: 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文件夹中。在 include 语句中使用引号而不是尖括号并不能解决问题,但是使用相对于文件的路径(例如../libs/spdlog/spdlog.h)可以正常工作。更让我困惑的是,在对应头文件的源文件中,我可以包含该文件没有问题。

我无法在任何地方找到类似的问题,我正在努力理解是什么导致 CMake 或 CLion 表现得像这样。

编辑:根据 Matthieu Brucher 的建议,我尝试使用包含文件夹的完全限定路径,但它仍然不起作用。问题似乎是在标题中似乎无法识别文件夹,因为它们在源文件中工作。

EDIT2:这是CMakeLists.txt我正在使用的全部内容。它嵌套在与整个项目的顶层不同的目录CMakeLists.txt中,因为这是我在网上找到的唯一解决方案,可以在 CLion 的解决方案中获得类似于 VS 的多个项目的东西。但是,由于所有路径都是相对的,我认为这不是问题。我也知道 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 完全无关的不同消息所取代......

4

2 回答 2

0

您可能想要使用完全限定的路径:

include_directories(${CMAKE_SOURCE_DIR}/libs/)
于 2018-11-13T13:43:57.357 回答
0

您还必须将包含文件夹添加到包含路径才能通过#include <spdlog/spdlog.h>. 这应该看起来像

include_directories(${CMAKE_SOURCE_DIR}/libs)

但我更喜欢使用

target_include_directories(yourTarget PUBLIC ${CMAKE_SOURCE_DIR}/libs)

yourTarget您要使用 spdlog 的目标在哪里。像这样,如果您要将您的内容链接到其他内容,您也可以使用包含目录yourTargetyourTarget如果您只需要在s cpp 文件中的spdlog,您可以将其更改PUBLICPRIVATE. 请参阅cmake 文档

于 2018-11-13T14:08:14.183 回答