【问题标题】:cmake include header only librarycmake 仅包含标头库
【发布时间】:2016-07-02 11:09:26
【问题描述】:

我想将spdlog 包含到我的一个项目中。它是一个只有标题的库。我正在构建的项目正在使用 cmake。目前我正在使用

include_directories('src/logger/spdlog/')

在 cmake 中并将库包含为

#include <spdlog/spdlog.h>

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

【问题讨论】:

  • 尝试在#include 中使用“”而不是
  • @JoseLinares 正在与 合作。正在添加额外的逗号:p
  • @xandercage 请问什么是"inverted-commas"?您的意思是在 CMakeLists.txt 代码中将 ' 替换为 "" 吗?
  • 只是删除它们。他们不需要

标签: c++ cmake spdlog


【解决方案1】:

Cmake 提供专门用于“仅头文件库”的接口库。我建议执行以下操作:

  1. 创建如下文件结构
third-party\spdlog\include
  1. Git 将 spdlog 存储库克隆到名称为 spdloginclude 目录中
  2. 使用以下内容创建third-party\spdlog\CMakeLists.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)
  1. 在项目的 CMakeLists.txt 中定义 TARGET_LOGGER。使用target_link_libraries(${TARGET_PROJECT} LINK_PUBLIC ${TARGET_LOGGER}) 将此目标链接到您的项目。也别忘了
add_subdirectory(
    third-party\spdlog
  )

然后,在您的项目中,您可以使用#include "spdlog/spdlog.h" 来包含该库

【讨论】:

  • 这是最好的答案,并使用现代 cmake 实践
【解决方案2】:

您可能离开了一个目录。尝试任一

 include_directories("src/logger")

CMakeLists.txt,或

 #include <spdlog.h>

在源代码中。

【讨论】:

  • 感谢其中之一,但我忘记的主要问题是inverted-commas,同时在 include_directories 中添加路径现在可以正常工作:)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2021-02-20
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多