【makefile】初步学习

本文介绍了Makefile的基础知识,包括其作为工程管理器的角色、大写M和小写m的区别,以及如何编写和优化Makefile。通过实例展示了Makefile如何处理文件依赖关系,确保编译的效率,并提供了清理编译产物的`make clean`命令。

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

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值