c++ 在CMake项目中找不到spdlog.h

5anewei6  于 2023-05-13  发布在  其他
关注(0)|答案(2)|浏览(370)

我正试图将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.txtCMakeLists.txt文件中,我定义了include目录:
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)

编辑3:当我试图重新创建错误以显示完整的消息时,不知何故,它不见了,被一个完全与CMake无关的不同的消息所取代...

ryevplcw

ryevplcw1#

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

include_directories(${CMAKE_SOURCE_DIR}/libs/)
bjp0bcyl

bjp0bcyl2#

您还必须将include文件夹添加到include路径,以便能够通过#include <spdlog/spdlog.h>包含。这应该是

include_directories(${CMAKE_SOURCE_DIR}/libs)

但我更喜欢用

target_include_directories(yourTarget PUBLIC ${CMAKE_SOURCE_DIR}/libs)

其中,yourTarget是要使用spdlog的目标。这样,如果您要将yourTarget链接到其他对象,则包含目录也可用。如果你只需要yourTarget的cpp文件中的spdlog,你可以把PUBLIC改为PRIVATE。参见cmake doc

相关问题