spdlog 仅标头,带有外部 fmt。 spdlog 错误:“内部”:不是“fmt”的成员

Posted

技术标签:

【中文标题】spdlog 仅标头,带有外部 fmt。 spdlog 错误:“内部”:不是“fmt”的成员【英文标题】:spdlog header-only with external fmt. spdlog error: 'internal': is not a member of 'fmt' 【发布时间】:2020-07-09 06:06:48 【问题描述】:

我正在使用仅标题的 spdlog 作为 cmake 的外部项目。

find_program(GIT_EXECUTABLE git)

ExternalProject_Add(
    spdlog
    PREFIX $CMAKE_BINARY_DIR/vendor/spdlog
    GIT_REPOSITORY "https://github.com/gabime/spdlog.git"
    GIT_TAG "v1.6.1"
    TIMEOUT 10
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    UPDATE_COMMAND ""
)

为了将外部 fmt 库链接到 spdlog,添加了以下内容。

add_subdirectory(fmt EXCLUDE_FROM_ALL)
...
target_link_libraries(myProject
        fmt::fmt
    )

在这种状态下执行。但是如果我添加以下代码来使用外部 fmt,就会出现编译错误。

#define SPDLOG_FMT_EXTERNAL   // If I add this code I get an error.
#include <spdlog/spdlog.h>

错误信息如下。

myproject\build\x64-Debug\vendor\spdlog\src\spdlog\include\spdlog\details\fmt_helper.h(40): error C2039: 'internal': is not a member of 'fmt'

我认为需要安装 spdlog 才能使用外部 fmt,而不是捆绑包,但我没有这样做。 当我使用“ExternalProject_Add”安装 spdlog 时,我想我需要做一些额外的事情,但我不知道它是什么。

我在 spdlog/CMakeLists.txt 中找到了一个似乎与此相关的选项

option(SPDLOG_FMT_EXTERNAL "Use external fmt library instead of bundled" OFF)

我尝试了以下方法将“SPDLOG_FMT_EXTERNAL”更改为“ON”,但问题仍然存在。我不确定这是否是正确的方法和合适的解决方案。谢谢。

ExternalProject_Add(
    spdlog
    PREFIX $CMAKE_BINARY_DIR/vendor/spdlog
    GIT_REPOSITORY "https://github.com/gabime/spdlog.git"
    GIT_TAG "v1.6.1"
    TIMEOUT 10
    CONFIGURE_COMMAND ""
    CMAKE_ARGS "-DSPDLOG_FMT_EXTERNAL=ON -DDSPDLOG_FMT_EXTERNAL:string=ON"
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    UPDATE_COMMAND ""
)

【问题讨论】:

但是.. 为什么不在项目配置时检查 git 树(或将其添加为 git 子模块)并使用 add_subdirectory @KamilCuk 你能告诉我怎么做吗? cliutils.gitlab.io/modern-cmake/chapters/projects/… 和网上其他各种 cmake 链接 【参考方案1】:

这已在 spdlog 1.7 版中修复:https://github.com/gabime/spdlog/releases/tag/v1.7.0:

支持使用外部 fmt 版本 7.x

【讨论】:

以上是关于spdlog 仅标头,带有外部 fmt。 spdlog 错误:“内部”:不是“fmt”的成员的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spdlog 绘制文本背景?

在 CMake 项目中找不到 spdlog.h

spdlog 错误:“不知道如何格式化类型,包括 fmt/ostream.h 如果它提供了应该使用的 operator<<”

使用 spdlog (C++) 记录,记录器未将日志写入文件

无法从 spdlog 中格式化参数

spdlog 基本结构分析