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

Windows下Makefile中使用cmd.exe设置变量后变量为空问题

问题原因与解决方法

原因分析

1. 多行命令变量丢失

GNU Make在Windows下会为每个缩进的命令行单独启动一个cmd.exe进程,每个进程的环境变量相互独立。第一行set TEST=test设置的变量仅在当前进程有效,第二行启动新进程时该变量已不存在,因此echo TEST is %TEST%中的%TEST%无法被替换,输出空值。

2. 单行命令的解析干扰

Makefile中%是模式匹配的特殊字符,Make会优先解析%TEST%,将其视为空值后再把命令传递给cmd。最终执行的命令实际是set TEST=test & echo TEST is ,导致输出异常。同时,即使Make不解析,cmd默认在执行命令前完成变量替换,同一行内刚设置的变量若不启用延迟扩展也无法立即读取。

解决方法

方法1:将多行命令打包为单个进程执行

通过cmd /c把多个命令合并到同一个cmd进程中,用反斜杠\实现Makefile内的换行:

.PHONY: default
default:
  @cmd /c "set TEST=test && echo TEST is %TEST%"

方法2:转义Make的特殊字符并启用延迟扩展

在Makefile中,用%%表示cmd中的单个%,避免Make解析干扰;同时启用cmd的延迟扩展,确保同一行内刚设置的变量能被读取:

.PHONY: default
default:
  @setlocal enabledelayedexpansion & set TEST=test & echo TEST is !TEST!

或者仅转义%(适用于cmd中变量已提前存在或不需要立即读取的场景):

.PHONY: default
default:
  @set TEST=test & echo TEST is %%TEST%%

内容的提问来源于stack exchange,提问作者Maarten ten Velden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:25:15