Makefile 学习
make - 工程管理器
nakefile就是make的执行规则
开发人员在拿到需求时,分到自己的几个功能模块,比如几个.c,然后再由一个人写一个总的makefile,把所有的功能都编译起来,也就是make工程管理区的作用
有时候会看到大写的M和小写的m
makefile–默认会找的小写的
Makefile–一般是程序员上传源码包命名的
因为用户需要拥有更高的权力,对于自己的工程项目可能需要自己写一些makefile文件,就可以新建一个小写的makefile文件,make在执行的时候就会优先调用
语法
target:files
command
现在我们编写一个小麻雀
main.c
#include <stdio.h>
#include "tool1.h"
#include "tool2.h"
int main() {
tool1();
tool2();
return 0;
}
tool1.c tool2.c
#include <stdio.h>
#include "tool1.h"
void tool1() {
printf("in my tool1\n");
}
tool1.h tool2.h
#ifndef TOOL1_H_
#define TOOL1_H_
void tool1(void);
#endif
通过gcc *.c 编译这些文件;这些的依赖关系是:
a.out -> main.o tool1.o tool2.o
main.o -> main.c
tool1.o -> tool1.c
tool2.o -> tool2.c
接下来如何编写一个makefile文件
ool:main.o tool1.o tool2.o
gcc main.o tool1.o tool2.o -o tool
main.o:main.c
gcc main.c -c -Wall -g -o main.o
tool1.o:tool1.c
gcc tool1.c -c -Wall -g -o tool1.o
tool2.o:tool2.c
gcc tool2.c -c -Wall -g -o tool2.o
执行make:显示具体内容,有两种方式
再执行一次呢?make: ‘tool’ is up to date.
因为make会对比 (目标文件和依赖文件的时间关系)tool:main.o tool1.o tool2.o
tool 比所依赖的文件时间都是最新的,那就说明tool就是最新的,依赖文件没有被更改
而tool比其所依赖的任意一个时间晚一些,就会被重新执行
如果在执行就看不到啦,所以一般都在makefile最后加上clean
clean:
rm -f *.o tool
执行make clean删除生成的文件
修改tool2.c内容,然后再make发现,只重新编译修改后的依赖文件
make -n
这将显示make 命令正在试图做的事情
make -n实际并不运行任何命令,只是把make试图做的事情显示出来
也可以使用make V=1
打印执行内容并执行
当然要是这么写makefile也是挺麻烦的!可以进行简化(先把之前的makefile拷贝一份)
1、OBJS=main.o tool1.o tool2.o
2、CC=gcc 系统默认CC就是系统的gcc
3、$(RM) =rm -f
4、CFLAGS+=-c -Wall -g
+=的意思是我不知道刚刚定义了那些选项,但我之后要加上这些选项
在执行一下还是跟之前一样
但这些还是很繁琐,再拷贝一份makefile
1、$^ 表示上述的依赖
2、$@表示上述的目标文件
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS+=-c -Wall -g
tool:$(OBJS)
$(CC) $^ -o $@
main.o:main.c
$(CC) $^ $(CFLAGS) -o $@
tool1.o:tool1.c
$(CC) $^ $(CFLAGS) -o $@
tool2.o:tool2.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o tool
3、其中由一部分是非常像的,所以我们可以提取出公式
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS+=-c -Wall -g
tool:$(OBJS)
$(CC) $^ -o $@
XX.o:XX.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o tool
当然不能写XX,要写%代表通配符
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS+=-c -Wall -g
tool:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o tool
这个的意思就是我要生成一个tool,需要这么多.o,而这些.o我现在没有,这些.o依赖跟这些.o同名的.a,通过这样的command来生成.o
本文介绍了Makefile的基础知识,包括其作为工程管理器的角色、大写M和小写m的区别,以及如何编写和优化Makefile。通过实例展示了Makefile如何处理文件依赖关系,确保编译的效率,并提供了清理编译产物的`make clean`命令。
6534

被折叠的 条评论
为什么被折叠?



