在 CMake 项目中找不到 spdlog.h

Posted

技术标签:

【中文标题】在 CMake 项目中找不到 spdlog.h【英文标题】:spdlog.h isn't found in CMake project 【发布时间】:2018-11-13 13:39:13 【问题描述】:

我正在尝试将 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/")

现在,当我尝试在位于src/ 的头文件中写入#include <spdlog/spdlog.h> 时,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 完全无关的消息替换...

【问题讨论】:

请显示更多代码:调用include_directoriesadd_executable、它们之间的相对位置等等。此外,显示您收到的确切错误消息。按照目前的措辞,我们只能建议您的代码有有问题 【参考方案1】:

您可能希望使用完全限定的路径:

include_directories($CMAKE_SOURCE_DIR/libs/)

【讨论】:

感谢您的回答!我尝试使用完全限定名称,但仍然找不到该文件。 在这种情况下,您需要提供更多信息,并提供一个重现问题的小示例。也许您将 include_directories 放在 add_subdirectory 之后?【参考方案2】:

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

include_directories($CMAKE_SOURCE_DIR/libs)

但我更喜欢使用

target_include_directories(yourTarget PUBLIC $CMAKE_SOURCE_DIR/libs)

其中yourTarget 是您要使用spdlog 的目标。像这样,如果您要将yourTarget 链接到其他东西,您也可以使用包含目录。如果您只需要 yourTargets cpp 文件中的 spdlog,您可以将 PUBLIC 更改为 PRIVATE。见cmake doc。

【讨论】:

感谢您的建议!现在似乎没有我改变任何东西,问题就以某种方式消失了。我得承认我对 CMake 还很陌生,所以很可能是我做错了什么。 从您提供的代码中,您使用的是include_directories($CMAKE_CURRENT_SOURCE_DIR/libs/),但您必须使用include_directories($CMAKE_CURRENT_SOURCE_DIR/libs/include)。这就是我试图在回答中解释的内容。 抱歉,刚刚知道您刚刚复制了包含目录。我更新了我的答案。

以上是关于在 CMake 项目中找不到 spdlog.h的主要内容,如果未能解决你的问题,请参考以下文章

CMake GoogleTests 在我的测试文件中找不到导入的头文件

CMake 在 Ubuntu 中找不到 GoogleTest 所需的库

Xcode Archive 在子项目中找不到头文件

在 Visual Studio 项目目录中找不到头文件

spdlog源码分析

cmake找不到头文件