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

GNU Makefile目标内变量名展开失效,目录创建失败问题咨询

GNU Makefile模式目标中shell变量未正确展开的问题解决

问题重现

我尝试在GNU Makefile的模式目标里基于规则创建目录,但变量$(OUT_DIR)始终是空的,导致mkdir -p命令没法正常工作。初始代码如下:

target_%: /home/user/%/.file : file.c
	export OUT_DIR = /home/user/$* ; \
	mkdir -p $(OUT_DIR) ;\
	. . .

问题原因

说白了,GNU Make是个“急性子”——它会在把命令交给shell执行之前,先把命令行里所有用$(...)包裹的Make变量提前展开。而你这里的OUT_DIR是shell变量,不是Make变量:Make解析到$(OUT_DIR)的时候,export OUT_DIR=...这个shell命令还没执行呢,所以Make会把它当成未定义的变量,直接展开成空字符串。最后实际执行的命令就变成了mkdir -p ,自然没法创建目录。

解决方法

要让shell变量在shell执行时才被展开,你需要给$加一层转义:用$${OUT_DIR}代替$(OUT_DIR)。这样Make在解析的时候,会把$$转成单个$,传递给shell的命令就变成了$OUT_DIR,这时候shell已经执行了export OUT_DIR=...,就能正确识别并展开这个变量了。

按照@Beta的建议修改后的代码如下:

target_%: /home/user/%/.file : file.c
	export OUT_DIR=/home/user/$* ; \
	mkdir -p $${OUT_DIR} ;\
	cd $${OUT_DIR} ; \
	ln -s /home/user/...

额外小提示

如果这个路径只需要用一两次,其实可以直接用$*,不用特意定义shell变量,比如直接写mkdir -p /home/user/$*,这样代码更简洁,也能避免变量展开的坑。但如果需要多次引用这个路径,定义shell变量还是更清晰易读的。

内容的提问来源于stack exchange,提问作者tulamba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:42:49