makefile .d的解释

在学写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.一样的

结束了.

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值