AppVeyor上C项目Windows构建失败问题求助
我来帮你搞定这两个让Windows构建失败的问题,咱们一步步梳理解决方案:
问题1:PATH中存在sh.exe导致MinGW Makefiles模式出错
这个报错的原因很明确:当你用MinGW Makefiles作为CMake生成器时,它要求你的PATH里不能有类Unix的shell(比如Git自带的sh.exe)——这些shell会和MinGW的make工具产生路径解析冲突。AppVeyor默认环境里Git的usr/bin目录在PATH中,所以触发了这个错误。
解决方法:调整PATH顺序,移除Git的sh.exe路径
在你的appveyor.yml中,执行CMake命令前,先把Git的usr/bin目录从PATH中临时移除,再把MinGW的bin目录放到PATH最前面,确保MinGW的工具优先被找到。示例配置:
build_script: # 先移除Git的sh.exe所在路径 - set PATH=%PATH:C:\Program Files\Git\usr\bin;=% # 添加MinGW的bin目录到PATH最前端(注意替换成你实际使用的MinGW路径) - set PATH=C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;%PATH% # 执行CMake和构建命令 - cmake -G "MinGW Makefiles" . - mingw32-make
问题2:CMake无法确定C编译器
这个问题通常是因为CMake在当前PATH里找不到C编译器(gcc),要么是MinGW路径没加对,要么是PATH顺序不对导致Git的工具优先被选中。结合上面的PATH调整,我们可以做两件事来确保编译器能被找到:
方法1:确保MinGW路径正确且优先级最高
上面的PATH调整已经把MinGW的bin目录放在最前面,只要路径正确,CMake应该能自动找到gcc.exe。如果AppVeyor环境里没有预装你需要的MinGW版本,你可以在install步骤里手动安装:
install: # 下载指定版本的MinGW-w64 - set MINGW_URL=https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/8.1.0/threads-posix/dwarf/i686-8.1.0-posix-dwarf-rt_v6-rev0.7z/download - appveyor DownloadFile %MINGW_URL% -FileName mingw.7z # 解压到指定目录 - 7z x mingw.7z -oC:\mingw-w64 > nul
方法2:手动指定C编译器路径
如果调整PATH后CMake还是找不到编译器,你可以在cmake命令里直接指定编译器路径:
build_script: - set PATH=%PATH:C:\Program Files\Git\usr\bin;=% - set PATH=C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;%PATH% # 手动指定C编译器为gcc.exe(或者用完整路径) - cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc.exe . - mingw32-make
如果怕路径有问题,也可以写完整路径:-DCMAKE_C_COMPILER=C:/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/bin/gcc.exe
额外提示:换用MSYS Makefiles生成器(可选)
如果你不想折腾PATH的问题,也可以把CMake生成器换成MSYS Makefiles,这个模式允许sh.exe在PATH中,但构建命令要换成make(而不是mingw32-make)。不过这个模式依赖MSYS环境,需要确保AppVeyor里有对应的环境,所以还是优先推荐前面的MinGW Makefiles解决方案。
内容的提问来源于stack exchange,提问作者einpoklum

