MinGW编译fmt彩色输出代码报错:fmt::v7::format_error::~format_error() was replaced
MinGW环境下使用fmt库带颜色格式化代码链接报错的原因与修复方案
问题描述
以下代码可正常编译运行:
#include "fmt/core.h" #include "fmt/color.h" void displayHelp() { fmt::print("Help!"); }
但添加颜色和格式修饰后的代码,在Windows MinGW环境下编译时出现链接错误:
#include "fmt/core.h" #include "fmt/color.h" void displayHelp() { fmt::print(fg(fmt::color::orange) | fmt::emphasis::bold,"Help!"); }
报错信息如下:
[ 94%] Built target Vibranium-Engine [ 94%] Building CXX object dep/Vibranium-Engine/Vibranium/CMakeFiles/vibranium.dir/Vibranium.cpp.obj [100%] Linking CXX executable V:\Vibranium-Core\vibranium.exe ld.lld: error: fmt::v7::format_error::~format_error() was replaced clang++: error: linker command failed with exit code 1 (use -v to see invocation) mingw32-make[3]: *** [dep\Vibranium-Engine\Vibranium\CMakeFiles\vibranium.dir\build.make:263: V:/Vibranium-Core/vibranium.exe] Error 1 mingw32-make[2]: *** [CMakeFiles\Makefile2:1957: dep/Vibranium-Engine/Vibranium/CMakeFiles/vibranium.dir/all] Error 2 mingw32-make[1]: *** [CMakeFiles\Makefile2:1964: dep/Vibranium-Engine/Vibranium/CMakeFiles/vibranium.dir/rule] Error 2 mingw32-make: *** [Makefile:766: vibranium] Error 2
该代码在macOS和Linux环境下可正常运行。
报错原因
这个链接错误的核心是fmt库的format_error析构函数被重复定义,在MinGW环境下触发该问题的常见场景:
- 项目同时引入了多个版本的fmt库(比如子模块的v7版本和系统安装的其他版本)
- 混合使用了静态链接和动态链接的fmt库,导致符号冲突
- CMake构建缓存残留旧配置,导致链接时引入重复的目标文件
修复方法
统一fmt库的链接方式
在项目的CMakeLists.txt中显式指定使用静态或动态链接:# 强制使用静态链接 set(FMT_USE_STATIC_LIBS ON) # 或使用动态链接:set(FMT_USE_DYNAMIC_LIBS ON) find_package(fmt REQUIRED)清理重复依赖
检查项目中是否存在多处引入fmt的情况(比如子模块、系统包管理器安装的库),保留唯一的依赖源,确保所有编译目标都链接同一个版本的fmt库。显式指定fmt版本
由于报错明确指向fmt v7,在CMake中锁定对应版本避免不匹配:find_package(fmt 7 REQUIRED)重置构建缓存
删除项目中的build目录和CMakeCache.txt文件,重新运行CMake生成构建文件,清除旧配置缓存的影响。
内容的提问来源于stack exchange,提问作者Venelin
相关产品推荐
相关产品推荐

