在学写makefile时候,如果要写的好一点高手建议要用个.d文件.我那时候也是非常迷糊,我写的测试代码不用这个也照样运行的很好啊,为什么要写这个东西呢?下面先看这个情况.
我们写的这个Makefile 一般要用隐晦规则.当然了如果就两个文件也没必要写这个东西了.用隐晦规则时候..o 文件会自动找这个 .c文件.然后编译.这个是没问题.如果有两个文件first.c main.c 你可以这样写
OBJS:=first.o main.o
main : $(OBJS)
gcc -o main $^
这样就行了.可以编译了.现在问题是如果你这个first.c里包含了一些头文件.比如包含了结构体声明.你修改了这个结构体里的成员.这个时候你又从新make了下.它是不会干什么的.因为你修改了头文件.隐晦规则其实自动给你加了这样的语句.
gcc -c *.c
这样的语句不关头文件的事.你头文件再怎么改,只要源文件不动.时间撮不变的.这个比较麻烦了.所以那个什么make 组织就建议在写依赖的时候把头文件包含进去.你可以这样写
gcc -c first.c first.h
哎.这样就好了.但是问题又来了.这样写太麻烦了,和写这个完整的makefile没区别了.万一我这个头文件不要了呢.万一改名字了呢?你得从makefile里把这个头文件全部找到.处理好.
所以得想办法。即能使用隐晦规则.又能包含了头文件.这就是最高宗旨.
同时gcc编译器有个功能 gcc -MM first.c 这样会输出first.o : first.c *.h 这个功能很诡异啊.
基于这个原因.这个.d出来了.也就是把每个源文件都gcc -MM下把输出从定向到一个对应的.d文件.比如
first. c 我们做了某个动作后就出来 first.d .然后把这个.d的内容在包含到这个Makefile里.哎.不错.思路有了.那就做吧,该怎么做呢?举个例子吧.
现在有两个源文件 first.c main.c 一个Makefile下面是内容
:
SRCS:=$(wildcard *.c) #这句不说. 如果你看不懂找书.个人认为<跟我一起写Makefile>书不错
OBJS=$(SRCS: .c=.o) # 后缀替换
.PHONY : all
all : dep main
dep:
%.d : %.c
rm -f $@; / #删除原来的.d文件
$(CC) -MM $< > $@.
; / #解释$<也就是.c 然后用 > 从定向到.d
是随机号
sed 's,/($*/)/.o[ :]*,/1.o $@ : ,g' < $@.
> $@; / #用sed工具处理
rm -f $@.
main : $(OBJS)
gcc -o main $^
sinclude $(SRCS:.c=.d)
clean:
-rm -f *.d *.o main.exe
哎.好了.就是这样的.我验证过的.可以分步:
make dep
make main
make clean
也可以直接
make 或则make all.一样的