Xcode13编译出现Undefined symbol: ___gcov_flush错误如何解决?
问题根因
Xcode 13起官方正式移除了对传统Gcov工具的内置支持,默认改用llvm-cov作为覆盖率统计实现,原有___gcov_flush接口已被废弃,因此Xcode 12可正常编译的代码升级后会触发链接报错。
报错完整信息如下:
Undefined symbols for architecture x86_64: "___gcov_flush", referenced from: -[AppDelegate applicationDidEnterBackground:] in AppDelegate.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方案
- 方案1:替换接口调用(推荐)
直接删除原有extern导出___gcov_flush的相关代码,改用LLVM官方提供的覆盖率刷新接口:- 导入对应头文件
#import <llvm-cov/CoverageMappingWriter.h>- 把原代码中所有调用
___gcov_flush()的位置,替换为__llvm_profile_write_file()即可。该接口功能和旧接口完全一致,会将内存中缓存的覆盖率数据写入本地.profraw格式的统计文件。
- 方案2:临时兼容旧逻辑(仅作过渡使用)
如果暂时不想修改原有代码逻辑,可以在项目的Build Settings中找到Other Linker Flags配置项,添加-lgcov参数强制链接兼容库,即可编译通过。该方案不建议长期使用,后续Xcode版本会彻底移除该兼容支持。 - 配套配置校验
确认Build Settings中以下两项配置为开启状态:- Generate Legacy Test Coverage Files 设置为 YES
- Instrument Program Flow 设置为 YES
调整后重新编译即可正常生成覆盖率统计所需的相关文件。
内容的提问来源于stack exchange,提问作者lauren1573
相关产品推荐
相关产品推荐

