只包含头文件库

cmake include header only library

本文关键字:文件 包含头      更新时间:2023-10-16

我想将spdlog包含到我的一个项目中。它是一个头文件库。我正在建设的项目是使用cmake。目前我正在使用

include_directories('src/logger/spdlog/')
在cmake中

并将库包含为

#include <spdlog/spdlog.h>

在logs.h内的记录器文件夹。我得到致命错误,没有这样的文件或目录。在我的应用程序中包含相同库的正确方法是什么?

Cmake专门为"头文件专用库"提供了接口库。我建议这样做:

  1. 创建如下文件结构
third-partyspdloginclude
  • Git将spdlog存储库克隆到include目录,名称为spdlog
  • 创建third-partyspdlogCMakeLists.txt,内容如下
  • find_package(Threads REQUIRED)
    add_library(${TARGET_LOGGER} INTERFACE)
    # add_library(spdlog::spdlog_header_only ALIAS ${TARGET_LOGGER})
    target_include_directories(${TARGET_LOGGER} INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
                                                            "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
    target_link_libraries(${TARGET_LOGGER} INTERFACE Threads::Threads)
    
    在项目的CMakeLists.txt中定义TARGET_LOGGER。使用target_link_libraries(${TARGET_PROJECT} LINK_PUBLIC ${TARGET_LOGGER})将此目标链接到您的项目。也别忘了
    add_subdirectory(
        third-partyspdlog
      )
    
    然后,在您的项目中,您可以使用#include "spdlog/spdlog.h"来包含库

    您可能不在一个目录中。试着

     include_directories("src/logger")
    
    CMakeLists.txt中的

    ,或

     #include <spdlog.h>
    

    首先,不要使用单引号',而是使用双引号",或者如果不包含空格,则使用纯字符串。

    我建议您使用find_path而不是直接添加包含。在那里你可以添加PATH_SUFFIXES。如果在配置过程中没有找到标头,则会得到一条消息,这使得发现错误变得更容易。
    文档:https://cmake.org/cmake/help/v3.6/command/find_path.html