Makefile执行报错Error 255:mingw32-make循环语句解析异常求助
Makefile执行报错:unexpected i(Error 255)排查方案
问题背景
我正在编写Makefile,目的是多次运行C程序并收集数据——针对每种优化级别、每个输入组合、MPI和OpenMP的线程/进程数组合各执行程序5次。但在我的机器上执行时出现报错:
unexpected i. mingw32-make: *** [MakefileW:60: execute] Error 255
(系统为意大利语,“unexpected i”为翻译后内容),同事的机器上该Makefile可正常运行,怀疑缺少必要组件,求助排查原因。
问题代码段
execute: for i in {1..5}; do \ for pair in "100 100" "1000 10000" "20000 10000" "30000 30000" "40000 40000"; do \ elem=$$(echo $$pair | cut -d' ' -f1); \ size=$$(echo $$pair | cut -d' ' -f2); \ ./src/lcs_diagonalO0.exe $$elem $$size 0; \ ./src/lcs_diagonalO1.exe $$elem $$size 1; \ ./src/lcs_diagonalO2.exe $$elem $$size 2; \ ./src/lcs_diagonalO3.exe $$elem $$size 3; \ for np in 1 2 3 4; do \ for omp in 1 2 3 4; do \ mpiexec -n $$np ./src/lcs_mpiompO0.exe $$elem $$size $$omp 0; \ mpiexec -n $$np ./src/lcs_mpiompO1.exe $$elem $$size $$omp 1; \ mpiexec -n $$np ./src/lcs_mpiompO2.exe $$elem $$size $$omp 2; \ mpiexec -n $$np ./src/lcs_mpiompO3.exe $$elem $$size $$omp 3; \ done; \ done; \ done; \ done; \
核心原因分析
报错本质是mingw32-make默认使用的shell不支持bash风格语法:
- 同事机器大概率用的是GNU Make搭配bash,而mingw32-make默认会调用Windows的
cmd.exe或老旧的sh,这些shell不支持{1..5}范围展开、$$(command)命令替换等bash专属语法,因此会把for i in {1..5}中的i识别为非法字符,抛出unexpected i错误。
排查与修复步骤
1. 强制Makefile使用bash执行
在Makefile开头添加一行,指定bash作为执行shell:
SHELL := /bin/bash
若你的mingw环境中bash路径不同(如C:\mingw64\bin\bash.exe),填写对应绝对路径即可。
2. 检查依赖组件完整性
- 验证bash安装:在命令行输入
bash --version,能正常输出版本信息则说明已安装;若未安装,通过mingw包管理器(如MinGW Installation Manager)安装bash组件。 - 验证MPI/OpenMP工具:
- 输入
mpiexec --version确认MPI可用; - 确认C程序编译时已添加OpenMP编译选项(如
-fopenmp),且运行环境支持OpenMP线程调度。
- 输入
3. 兼容cmd的语法替换(可选)
若无法使用bash,可将bash语法改为cmd兼容写法:
- 把
{1..5}替换为1 2 3 4 5; - 用cmd的
for /f命令替代$$(echo ... | cut ...)来分割字符串,但这种写法较为繁琐,优先推荐bash方案。
内容的提问来源于stack exchange,提问作者Alessandro Marchesano
相关产品推荐
相关产品推荐

