PAYATHON 2026

Xcode 26.4 构建 React Native iOS 时出现 fmt consteval 错误

数据小陈

结论

如果首个错误来自 Pods/fmt/include/fmt/format-inl.h,这个现象与旧版 fmt 在 Xcode 26.4 下的 C++ 编译兼容性问题一致。可以先将 fmt target 调整为使用 C++17,作为临时方案。长期来看,应升级到包含相关依赖修复且适合当前项目的 React Native 版本。React Native 仓库中已有相同错误的记录和 C++17 绕过方案。相关问题记录

原始信息没有提供完整编译日志和实际 fmt 版本,还不能仅凭这一行错误确认具体触发点。

为什么清缓存没有解决

consteval 要求相关调用能在编译期求值。fmt 会利用这一机制检查格式字符串;当编译器无法将调用判定为常量表达式时,就会产生这条错误。fmt 格式字符串检查说明

如果重装后仍使用同一套依赖和编译设置,清理 DerivedData、重装 node_modules 或重新运行 pod install 都不会改变触发错误的代码。

先确认错误来自哪个 target

在 Xcode 构建日志中展开第一条错误,记录:

  • 正在编译的 target 和源文件。
  • 报错头文件的完整路径,以及后续 note: 提示。
  • ios/Podfile.lock 中实际解析出的 fmt 版本。

即使报错头文件位于 fmt 目录,正在编译的 target 也不一定是 fmt。其他依赖也可能包含 fmt 头文件,这会影响下面临时方案的适用范围。

临时方案:仅将 fmt target 调整为 C++17

如果错误发生在 fmt target,将下面的代码加入 ios/Podfile 已有的 post_install 块,放在现有 react_native_post_install(...) 调用之后。保留原来的调用及参数,不要额外创建第二个 post_install 块。

installer.pods_project.targets.each do |target|
  next unless target.name == 'fmt'

  target.build_configurations.each do |build_config|
    build_config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++17'
  end
end

在 fmt 11.0.2 中,C++17 模式会关闭头文件中的 consteval 路径,这也是该绕过方案的依据。fmt 11.0.2 源码

随后重新生成 Pods 工程:

cd ios
bundle exec pod install

如果项目没有使用 Bundler,则执行 pod install。完成后打开项目的 .xcworkspace,执行 Clean Build Folder 并重新构建。确认 Debug 和 Release 的实际编译命令都采用了预期设置。

这个调整只作用于 fmt target。如果错误发生在其他 target 编译 fmt 头文件时,它可能仍会出现。不要因此把整个 React Native 工程统一降为 C++17,因为其他原生依赖可能需要 C++20。

长期方案:升级兼容的依赖组合

React Native 已合入一项改动,将 fmt 升级到 12.1.0 以修复 Xcode 26.4 构建问题,涉及 fmt 和 RCT-Folly 等依赖配置。改动合入上游,并不代表所有 0.81.x 补丁版本都包含修复。React Native 修复记录

升级前应核对目标 React Native 版本的依赖配置,并检查项目原生模块及架构要求。在 Podfile 中强行指定另一个 fmt 版本,可能与 React Native 的 podspec 版本约束冲突。

如果暂时无法升级,且系统与 SDK 要求允许,可以使用项目此前已验证可构建的 Xcode 版本过渡。

临时调整仍失败时怎么办

如果实际使用的是 fmt 11.0.2,还要注意:直接添加 -DFMT_USE_CONSTEVAL=0 可能被其头文件内部的宏定义覆盖,不能将这个编译参数视为通用修复。宏检测逻辑

确需修补头文件时,应将补丁纳入可重复执行的依赖安装流程,并严格匹配当前源码版本。手工修改 Pods 中的文件,重新安装后容易丢失。

如果日志最终指向自己编写的 C++ 格式化调用,还应检查是否把运行时字符串传给了要求编译期检查的接口。支持该 API 的 fmt 版本可使用 fmt::runtime(...) 处理运行时格式字符串,不应拿来批量替换第三方库内部调用。fmt API 说明

备注:内容仅供参考。