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
相关产品推荐
相关产品推荐

