为何无法在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
相关产品推荐
相关产品推荐

