MinGW GCC在WSL文件系统下无法启用coverage编译的问题
解决MinGW GCC在WSL文件系统上生成coverage文件失败的问题
问题背景
在WSL2 Ubuntu 22.04环境下,将WSL中的Git仓库映射为Windows盘符后,使用MSYS2各版本GCC(14.2.0、12.2、10.4)执行gcc --coverage编译时,会生成0字节的.gcno文件并报错cannot open *.gcno,但常规编译无异常。需求是无需在WSL与Windows间复制源码,保留GCC的--coverage选项完成构建。
可行解决方案
1. 切换到WSL1
WSL1的文件系统与Windows兼容性更强,不存在WSL2中9p协议处理特定文件操作的限制:
- 关闭WSL:
wsl --shutdown - 将Ubuntu发行版切换为WSL1:
wsl --set-version Ubuntu-22.04 1 - 重启WSL后重新映射盘符并尝试编译
2. 调整WSL2的9p挂载参数
修改WSL2的挂载配置,优化文件权限与元数据处理逻辑:
- 在Windows用户目录(
C:\Users\<你的用户名>)下创建或编辑.wslconfig文件,添加以下内容:[wsl2] options="metadata,umask=0022,fmask=0022,uid=1000,gid=1000" - 执行
wsl --shutdown关闭WSL后重启,再尝试编译
3. 在WSL内完成带coverage的编译
直接在WSL环境中用GCC执行编译,生成的可执行文件与.gcno文件可通过映射盘符直接供Windows使用:
gcc --coverage test.c -o test.exe
编译完成后,Windows端可直接访问映射盘符中的产物,后续coverage统计流程不受影响
4. 指定coverage文件输出到Windows本地磁盘
通过GCC参数将.gcno文件定向到Windows本地目录,绕过WSL文件系统的兼容性问题:
gcc --coverage test.c -o X:\test\test.exe -fprofile-dir=C:\temp\coverage
需提前创建C:\temp\coverage目录,确保GCC有写入权限
内容的提问来源于stack exchange,提问作者Dmitry Grigoryev
相关产品推荐
相关产品推荐

