博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Makefile教程(三)
阅读量:3521 次
发布时间:2019-05-20

本文共 1689 字,大约阅读时间需要 5 分钟。

自动生成依赖性

应用场景:头文件更新了 如何让源文件也自动更新

目录结构

在这里插入图片描述

直接编译的话 会报错 找不到头文件
所以这里通过 -I指定头文件路径 或者 在#include “head/head.h”

gcc *.c -I./head
TGT = a.outSRCS = main.c test.c foo.c#CROSS_COMPILE = arm-linux-genuabihf-CC = $(CROSS_COMPILE)gccCFLAGS = -I$(HEAD_PATH)CUR_PATH = $(shell pwd)HEAD_PATH = $(CUR_PATH)/head$(TGT): $(SRCS:.c=.o)	$(CC) $^ $(CFLAGS) -o $@%.o: %.c	$(CC) -c $<%.d: %.c	$(CC) -MM $< > $@sinclude $(SRCS:.c=.d)clean:	rm -vf $(TGT) $(SRCS:.c=.o) $(SRCS:.c=.d)

分析:

把文件所需的依赖,全部写在Makefile中,如果某个依赖更新了,那么对应的目标肯定也会更新。
命令 $(CC) -MM $< > $@ 会将当前路径下的所有.c的依赖输出到文件%.d中去,然后sinclude把所有的.d文件的内容加载进来,

%.d: %.c	$(CC) -MM $< > $@main.o: main.c head/head.htest.o: test.cfoo.o: foo.c

所以,当依赖比目标更新的时候,自然就引发目标的重新编译了

输出结果:

zys@ubuntu:~/linux/application/makefile/p5$ make
gcc -MM foo.c > foo.d
gcc -MM test.c > test.d
gcc -MM main.c > main.d
gcc -c main.c
gcc -c test.c
gcc -c foo.c
gcc main.o test.o foo.o -I/home/zys/linux/application/makefile/p5/head -o a.out

思考

可以看到输出结果是先输出.d 再输出.o。

如果把$(CC) -c $< 和 $(CC) -MM $< > $@交换下位置 会不会先输出.o呢

TGT = a.outSRCS = main.c test.c foo.c#CROSS_COMPILE = arm-linux-genuabihf-CC = $(CROSS_COMPILE)gccCFLAGS = -I$(HEAD_PATH)CUR_PATH = $(shell pwd)HEAD_PATH = $(CUR_PATH)/head$(TGT): $(SRCS:.c=.o)	$(CC) $^ $(CFLAGS) -o $@ %.d: %.c	$(CC) -MM $< > $@sinclude $(SRCS:.c=.d)%.o: %.c	$(CC) -c $< clean:	rm -vf $(TGT) $(SRCS:.c=.o) $(SRCS:.c=.d) .PHONY: clean

输出结果:

gcc -MM foo.c > foo.d
gcc -MM test.c > test.d
gcc -MM main.c > main.d
gcc -c main.c
gcc -c test.c
gcc -c foo.c
gcc main.o test.o foo.o -I/home/zys/linux/application/makefile/p5/head -o a.out

输出结果仍然是.d再前 由此看来,输出结果跟命令的先后顺序无关

疑问:

在这里插入图片描述
执行过程:1-2-3
.d为啥为生成呢 什么时候生成

伪目标

不是一个真正的目标,仅仅是为了执行其所在的规则下面的命令,不应该让make来判断它是否存在,或者是否应该被生成。.PHONY clean

转载地址:http://yxqqj.baihongyu.com/

你可能感兴趣的文章
MySQL笔记
查看>>
计算机运算方法之(原码 补码 反码 移码)
查看>>
计算机组成原理之(二进制与十进制互相转换,数的定点表示与浮点数表示)例题:设浮点数字长16位,其中阶码5位(含有1位阶符),尾数11位(含有1位数符)
查看>>
冒泡排序及其优化
查看>>
选择排序(java代码实现)
查看>>
插入排序
查看>>
哈夫曼树java代码实现
查看>>
快速排序
查看>>
vue路由高亮的两种方式
查看>>
vue router 报错: Uncaught (in promise) NavigationDuplicated {_name:""NavigationDuplicated"... 的解决方法
查看>>
vue跳转页面的两种方式
查看>>
存储器题目解析(持续更新中....)
查看>>
存储器知识要点
查看>>
Cache模拟器的实现
查看>>
实验2:MIPS指令系统和MIPS体系结构
查看>>
设计模式七大原则
查看>>
手写 | spring事务
查看>>
AndroidStudio Gradle手动下载
查看>>
SpringBoot入门(二)场景启动器
查看>>
SpringBoot入门--自动配置
查看>>