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

为何无法在Makefile的依赖项中使用$(@D)变量?

编译C文件时确保目标目录存在的Makefile写法对比与问题解决

编译C文件并将生成的目标文件输出到独立目录时,必须确保目标目录已存在。目前有两种常见的实现方式:

方式一:始终创建当前目标的目录

这种写法通过$(@D)自动获取目标文件所在目录,避免路径重复,更健壮:

obj/%.o: src/%.c
    @mkdir -p $(@D)
    $(CC) ...

方式二:将目标目录作为依赖项

这种写法仅调用一次mkdir,概念上更合理:

obj/%.o: src/%.c | obj/
    $(CC) ...

obj/:
    mkdir -p $@

尝试结合两种写法的问题

我想结合两种写法的优势,写出如下代码:

obj/%.o: src/%.c | $(@D)
    $(CC) ...

obj/:
    mkdir -p $@

但编译时会报错,提示obj/目录不存在。

二次扩展的解决办法

参考MadScientist提到的二次扩展,我使用了以下写法:

.SECONDEXPANSION
obj/%.o: src/%.c: $$(@D)
    $(CC) ...

obj:
    mkdir -p $@

这种写法能正常工作,但存在末尾斜杠的问题,所以暂时移除了斜杠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:42:33