makefile的自动推导

main.c 文件

#include <stdio.h>
int main()
{
        printf("mian \n");
        return 0;
}

test.c 文件

#include <stdio.h>
int val2 = 100;

Makefile 文件

%.d:%.c
        g++ -MM $< > $@ >$@.tmp; \
        sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@; \
        rm -f $@.tmp

.PHONY: clean

sources = test.c main.c 
include $(sources:.c=.d)

main:main.o test.o
        g++ $^ -o $@
clean:
        rm *.o

然后就可以编译出可执行文件了。


Makefile的推导过程

知识点1:

test.o:test.c

上面这一条命令等价于 ,因为makefile会自动的补全这样的命令。

test.o:test.c
  g++ test.c -c test.o

知识点2:

%.d:%.c
        g++ -MM $< > $@ >$@.tmp; \
        sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@; \
        rm -f $@.tmp

会生成一个.d 文件

test.o test.d : test.c

知识点3:

include $(sources:.c=.d)

等价于

include test.d main.d 

等价于 把对应的.d文件导入到makefile中

test.o test.d : test.c

再根据知识点1,这一条语句变成了这样。

test.o test.d : test.c
    g++ test.c -o test.c

于是,上面的makefile变成

%.d:%.c
        g++ -MM $< > $@ >$@.tmp; \
        sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@; \
        rm -f $@.tmp

.PHONY: clean

sources = test.c main.c 

test.o test.d : test.c
      g++ test.c -o test.c
main.o main.d : main.c
      g++ main.c -o main

main:main.o test.o
        g++ $^ -o $@
clean:
        rm *.o
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,077评论 0 13
  • 来自陈浩的一片老文,但绝对营养。 示例工程:3 个头文件*.h,和 8 个 C 文件*.c。 初 编译过程,源文件...
    周筱鲁阅读 4,753评论 0 17
  • makefile关系到整个工程的编译规则,一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干的目录当中,...
    Joe_HUST阅读 1,911评论 0 3
  • 1.Makefile规范 target 这 一 个 或 多 个 的 目 标 文 件 依 赖 于prerequisi...
    G风阅读 1,966评论 0 3
  • 最近几日经常是掐着点去上班,就会常遇见脚步匆匆的上班族,有的边走边打电话、看微信,有的边走边吃早餐.... ...
    幸福就是刚刚好阅读 202评论 0 0