Windows11虚拟机Cygwin64+MinGW64环境下gcov无法生成gcda文件
Windows环境下MinGW编译gcov覆盖率文件生成失败问题
环境背景
- M1芯片Mac上相关操作正常,需确保程序可在Windows环境构建
- 使用Windows 11虚拟机,手动安装SSH-Server后通过SSH连接操作
Cygwin及构建工具安装步骤
- 下载
setup-x86_64.exe - 执行基础安装命令:
$exePath -qnNdO -R C:/cygwin64 -s http://cygwin.mirror.constant.com -l C:/cygwin64/var/cache/setup - 切换到bash环境
- 安装构建工具:
- 配置setup别名:
alias setup="/cygdrive/c/cygwin64/setup-x86_64.exe -qnNdO -R C:/cygwin64 -s http://cygwin.mirror.constant.com -l C:/cygwin64/var/cache/" - 安装依赖包:
setup -P autoconf -P automake -P make -P git -P gperf -P gcovr -P coreutils -P mingw64-x86_64-gcc-g++ -P mingw64-x86_64-yaml -P mingw64-x86_64-boost -P mingw64-x86_64-dlfcn - 建立软链接:
ln -s /cygdrive/c/cygwin64/bin/x86_64-w64-mingw32-g++.exe /cygdrive/c/cygwin64/bin/g++ ln -s /cygdrive/c/cygwin64/usr/x86_64-w64-mingw32/bin/ar.exe /cygdrive/c/cygwin64/bin/ar.exe
- 配置setup别名:
测试程序编译及运行过程
测试代码test.cpp:
#include <iostream> int main(int argc, char* argv[]) { if (argc % 2 == 0) { std::cerr << "We have a 0\n"; } else { std::cerr << "We have a 1\n"; } }
编译及运行命令:
# 查看文件 $ ls -la total 378 drwxrwxrwx+ 1 Loki None 0 May 16 16:23 . drwxrwx---+ 1 SYSTEM SYSTEM 0 May 16 15:39 .. -rw-r--r--+ 1 Loki None 161 May 16 15:38 test.cpp # 编译 g++ -c test.cpp -g -fprofile-arcs -ftest-coverage -coverage g++ -o done test.o -g -fprofile-arcs -ftest-coverage -coverage -lgcov # 首次运行 PATH=/cygdrive/c/cygwin64/usr/x86_64-w64-mingw32/sys-root/mingw/bin/ ./done.exe 1 We have a 0 libgcov profiling error:/cygdrive/c/Users/Loki/G/test.gcda:overwriting an existing profile data with a different timestamp # 查看文件(无test.gcda) ls -la total 378 drwxrwxrwx+ 1 Loki None 0 May 16 16:23 . drwxrwx---+ 1 SYSTEM SYSTEM 0 May 16 15:39 .. -rwxr-xr-x+ 1 Loki None 338149 May 16 16:23 done.exe -rw-r--r--+ 1 Loki None 161 May 16 15:38 test.cpp -rw-r--r--+ 1 Loki None 1692 May 16 16:23 test.gcno -rw-r--r--+ 1 Loki None 19596 May 16 16:23 test.o # 第二次运行 $ PATH=/cygdrive/c/cygwin64/usr/x86_64-w64-mingw32/sys-root/mingw/bin/ ./done.exe 1 We have a 0 # 再次查看文件(仍无test.gcda) ls -la total 378 drwxrwxrwx+ 1 Loki None 0 May 16 16:23 . drwxrwx---+ 1 SYSTEM SYSTEM 0 May 16 15:39 .. -rwxr-xr-x+ 1 Loki None 338149 May 16 16:23 done.exe -rw-r--r--+ 1 Loki None 161 May 16 15:38 test.cpp -rw-r--r--+ 1 Loki None 1692 May 16 16:23 test.gcno -rw-r--r--+ 1 Loki None 19596 May 16 16:23 test.o
问题现象
- 首次运行出现时间戳冲突报错,第二次运行无警告
- 两次运行后均未生成预期的
test.gcda覆盖率数据文件
解决思路
- 路径格式适配:MinGW生成gcda文件时可能无法正确解析Cygwin风格路径,尝试将程序放在MinGW原生路径下,或使用Windows原生路径(如
C:\Users\Loki\G\done.exe)运行程序。 - 权限检查:确认程序运行目录有写入权限,
test.gcda需要程序运行时能写入当前目录或指定输出目录。 - 版本一致性:确保编译用的MinGW gcc与运行时依赖的libgcov版本完全匹配,避免版本不兼容导致文件生成失败。
- 显式指定输出路径:编译时添加
-fprofile-dir=C:/Users/Loki/G/参数,用Windows原生格式指定gcda文件输出目录。 - 清理残留文件:首次报错提示时间戳冲突,可能存在未显示的旧gcda文件,彻底清空目录后重新编译运行。
内容的提问来源于stack exchange,提问作者Loki Astari
相关产品推荐
相关产品推荐

