You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2017用CMake构建C++项目时spdlog、fmt库链接报错如何解决

问题解决方案

链接错误的根本原因是编译spdlog依赖库时未开启宽字符转换支持宏,只有你的业务代码开启了SPDLOG_WCHAR_TO_UTF8_SUPPORT宏,导致spdlog库本身没有生成对应的宽字符转换函数符号,业务代码调用时就找不到对应实现。Linux下没有触发宽字符相关代码路径,所以不会出现该报错。

具体解决步骤

  • 第一步:在引入spdlog子项目前,提前设置宽字符支持的相关宏,确保spdlog编译时就生成对应函数
  • 第二步:显式指定spdlog使用你引入的外部fmt库,避免spdlog内置fmt和外部fmt版本冲突
  • 第三步:删除本地原有的build目录缓存,重新生成CMake工程再编译

修改后的CMakeLists.txt核心片段

只需要调整spdlog引入部分的配置即可:

# 建议在project指令后新增C++版本声明,VS2017原生支持C++17
set(CMAKE_CXX_STANDARD 17 CACHE STRING "" FORCE)
set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE BOOL "" FORCE)

# ... 原有fmt引入部分不变 ...

FetchContent_Declare(
    spdlog
    GIT_REPOSITORY https://github.com/gabime/spdlog.git
    GIT_TAG        v1.9.2
    )
if (NOT spdlog_POPULATED)
    FetchContent_Populate(spdlog)
    set(SPDLOG_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
    set(SPDLOG_BUILD_BENCH    OFF CACHE BOOL "" FORCE)
    set(SPDLOG_BUILD_TESTS    OFF CACHE BOOL "" FORCE)
    # 新增以下3行宽字符和外部fmt配置
    set(SPDLOG_WCHAR_SUPPORT ON CACHE BOOL "" FORCE)
    set(SPDLOG_WCHAR_TO_UTF8_SUPPORT ON CACHE BOOL "" FORCE)
    set(SPDLOG_FMT_EXTERNAL ON CACHE BOOL "" FORCE)
    add_subdirectory(${spdlog_SOURCE_DIR} ${spdlog_BINARY_DIR})
endif()

原有全局的add_definitions(-DSPDLOG_WCHAR_TO_UTF8_SUPPORT)可以直接删除,spdlog的配置会自动把需要的宏传递给所有依赖它的目标。

如果修改后仍报错,可以检查VS生成的项目属性,确认字符集配置为使用Unicode字符集,不要使用多字节字符集。


内容的提问来源于stack exchange,提问作者flashburn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:18:02