通用Makefile文件简单入门和编写(1)

本文介绍了Makefile的基本概念和用途,强调了其在自动化编译和节省时间上的优势。通过实例展示了最简单的Makefile格式,解释了目标、依赖文件和命令之间的关系。文章还提到了Makefile中tab键的重要性,以及依赖文件缺失导致的问题。此外,讨论了伪目标如'all'和'clean'在Makefile中的作用,通常用于定义整个项目的构建和清理操作。

前言

在开始之前,我们首先需要了解为什么需要Makefile文件。之前我们学习C语言的时候,是在VC上面编译的,而不管是VC还是keil等单片机开发平台,我们只要点击一个编译按钮,平台工具就能自动帮我们编译和链接成可执行文件,并且它们还能根据文件修改的时间来决定哪些文件需要重新编译,哪些不需要,对于一些非常大的项目或者工程能极大缩短编译时间。而Makefile就是完成类似的任务,一个好的Makefile,功能甚至比这些平台还要强大。

最简单的Makefile文件

这是Makefile的一般格式:

<target> : <prerequisites>
[tab] <command>

target
可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。
prerequisites
生成该target所依赖的文件或target(目标)
command
该target要执行的命令(任意的shell命令)

直接看一个例子,我们在文件夹一下有一个test.c文件,同目录下有一个Makefile文件如下:

test:test.c
	gcc -o test test.c

我们直接在当前目录下只要执行make指令就可以生成test可执行文件。

当我们执行make指令的时候如果缺省后面的文件名,那么就会默认生成第Makefile中的第一个目标文件,在这个例子中就是test。"test:"后面跟着的是当前目标所依赖的文件。如果任意一个依赖文件比目标文件新,那么这个目标文件就会被重新编译。

第二行就是我们为了生成这个目标文件需要做的操作,这里就是用GCC编译器编译test.c文件。特别注意gcc前面是是一个tab而不是几个空格,这个是新手经常都会犯的错误。

这边做一个小试验,如果省掉后面的依赖文件:

test:
	gcc -o test test.c

会发现无论我们怎么修改test.c文件,最后的输出结果都不变。这是因为要生成test目标文件的时候,Make指令会去判断test的依赖文件是否比test新,但是因为没有依赖文件,所以make指令就默认不执行下面的命令,这样就需要我们把test文件删除以后再重新make,修改才有效。
但是如果我们把目标文件用all替代test

all:
	gcc -o test test.c

最后的结果就会随着test.c做相应的变化。这是因为Makefile中有默认的两个伪目标文件allclean,伪目标文件的特点就是无论后面是否存在依赖文件,或者依赖文件是否比目标文件新,都会执行下面的命令。

所以在很多的Makefile文件中,在all:后面跟总的操作指令,在clean后面跟一些删除文件的指令,例:

all : 
	make -C ./ -f $(TOPDIR)/Makefile.build
	$(CC) $(LDFLAGS) -o $(TARGET) built-in.o


clean:
	rm -f $(shell find -name "*.o")
	rm -f $(TARGET)

除了allclean我们可以自己用.PHONY :命令指定目标为伪目标:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值