cmake 仅包含标头库

新手上路,请多包涵

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

include_directories('src/logger/spdlog/')

在 cmake 中并将库包括为

#include <spdlog/spdlog.h>

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

原文由 xander cage 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

我建议您使用 find_path 而不是直接添加包含。在那里你可以添加 PATH_SUFFIXES 。如果找不到标头,您会在配置过程中收到一条消息,这样更容易发现错误。

文档: https ://cmake.org/cmake/help/v3.6/command/find_path.html

原文由 usr1234567 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

  1. 创建如下文件结构
third-party\spdlog\include

  1. Git 将 spdlog 存储库克隆到 include 目录,名称为 spdlog
  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" 来包含该库

原文由 Han Luo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题