makefile中关于.d文件的疑问

编译打包和其他
回复
maple_169324
帖子: 11
注册时间: 2018-12-29 14:13
系统: ubuntu

makefile中关于.d文件的疑问

#1

帖子 maple_169324 » 2019-01-05 22:34

makefile文件:
DEPS=$(addprefix $(BIN_DIR)/,$(patsubst %.c,%d,$(SRCS)))
sinclude $(DEPS)

OBJECTS=$(addprefix $(BIN_DIR)/,$(patsubst %.c,%.o,$(SRCS)))


$(BIN_DIR)/%.d:%.c:
@set -e;rm -f $@;
gcc -MM $< > $@.$$$$;\
sed 's,\($*\)\.o[:]*,\1.o $@:,g' < $@.$$$$ >$@;\
echo -e -n "\t\x24gcc -c \24< -o \x24@" >> $@;\
$(RM) $@.$$$$

这段代码是在将SRCS文件中的所有.c文件的依赖关系写入到.d文件中去。但是对于代码的执行顺序有点疑问。
1 进入SRCS文件夹的时候,并没有.d文件。此时sinclude $(DEPS) 后会将$(DEPS) 添加到makefile文件中,也就是 $(BIN_DIR)/%.d这个目标,添加后,会自动去执行$(BIN_DIR)/%.d这个目标,然后生成.d文件?
2 生成了.d文件后,.d文件中的依赖关系又是如何添加进makefile文件里面的呢?
3 对于echo -e -n "\t\x24gcc -c \24< -o \x24@" >> $@;\的意义不是很清楚,将gcc的命令写入到.d文件的目的是什么?


自己了做一个测试:makefile文件
sinclude main.d
debug :
@echo $@
main.d的内容如下
main.o main.d: main.c head/calc.h
当执行这个makefile文件的时候自动执行了 编译的命令,这是为什么呢
cc -c -o main.o main.c
main.c: In function ‘main’:
main.c:10:7: warning: implicit declaration of function ‘calculate’ [-Wimplicit-function-declaration]
c=calculate(n,k);
头像
astolia
论坛版主
帖子: 6444
注册时间: 2008-09-18 13:11

Re: makefile中关于.d文件的疑问

#2

帖子 astolia » 2019-01-07 16:07

手册里面啥都有
https://www.gnu.org/software/make/manua ... ml#Include
https://www.gnu.org/software/make/manua ... requisites
https://www.gnu.org/software/make/manua ... icit-Rules

另外代码直接复制粘贴上来后用完整编辑器工具栏里的显示代码功能包起来,你写的简直乱七八糟,错误一堆
回复