You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:53:09