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

前言

在开始之前,我们首先需要了解为什么需要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

猜你喜欢

转载自blog.csdn.net/yunlong654/article/details/86091904