在 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_directories
、add_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
链接到其他东西,您也可以使用包含目录。如果您只需要 yourTarget
s 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 在我的测试文件中找不到导入的头文件