Windows 32位下Intel C编译器编译fmt库报常量表达式错误求助
问题成因
- 编译报错的直接原因是32位Intel C编译器(ICC)对128位整数常量表达式的支持存在缺陷:fmt 8.0.1版本中
format-inl.h内的pow10_significands数组使用constexpr修饰,依赖编译器的128位常量编译期计算能力,32位ICC的对应实现不符合C++标准要求,无法完成编译。 - 未启用仅头文件模式仍引入
format-inl.h的原因:大概率是项目预处理器配置异常。非仅头文件模式下fmt要求全局定义FMT_HEADER_ONLY=0,如果项目其他依赖头文件提前定义了FMT_HEADER_ONLY宏,或是没有正确配置全局预定义宏,就会强制触发仅头文件模式逻辑,引入format-inl.h头文件。
修复建议
- 优先调整预处理器配置:在项目全局预定义宏中添加
FMT_HEADER_ONLY=0,同时遍历所有依赖头文件,排查是否有其他位置擅自定义FMT_HEADER_ONLY宏,切断非必要的format-inl.h引入路径。 - 若继续使用ICC编译:可手动修改报错位置的代码,将
static constexpr const uint128_wrapper pow10_significands[]中的constexpr修改为const,放弃该数组的编译期计算;也可升级fmt到9.0及以上版本,该版本已经针对ICC的兼容性问题做了适配,无需修改源码即可编译。 - 若改用MSVC编译:32位MSVC 2019及以上版本对fmt 8.0.1的兼容性已经过社区验证,无需修改源码,仅需在构建配置中指定编译器为MSVC,关闭
FMT_HEADER_ONLY宏即可正常编译非仅头文件版本的fmt库。
内容的提问来源于stack exchange,提问作者ErlingMOSEK
相关产品推荐
相关产品推荐

