我正试图将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目录: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是一个C11库,但在不久的将来,我会在其他地方需要一些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无关的不同的消息所取代...
2条答案
按热度按时间ryevplcw1#
您可能希望使用完全限定路径:
bjp0bcyl2#
您还必须将include文件夹添加到include路径,以便能够通过
#include <spdlog/spdlog.h>
包含。这应该是但我更喜欢用
其中,
yourTarget
是要使用spdlog的目标。这样,如果您要将yourTarget
链接到其他对象,则包含目录也可用。如果你只需要yourTarget
的cpp文件中的spdlog,你可以把PUBLIC
改为PRIVATE
。参见cmake doc。