1.序言:
前面的课程讲解了从gcc编译过程到其实践,大家可以看到其实在这些步骤中有些是可以简化编译的,但由于参数多以及项目中文件数量多的原因难免会造成错误甚至是浪费大量的时间在这编译上,为此linux系统中专门也有这个工具:makefile。
2.原理:
其实本质Makefile文件(通常开头是大写M)就是一个shell文件通过指定的规则来编译文件。知识点如下:
makefile工具是通过其规则来执行命令,一般其内容分为宏定义以及命令。简单的宏定义在最后讲解下,这先讲命令格式:
target ... : prerequisites ... command
其中target就是目标文件可以是.o文件也可以是可执行文件;
prerequisites是生成target所需要的依赖文件,可以是代码文件,也可以是目标文件;
command就是makefile执行的命令,这里之前忘记了多谢的提醒,一定是要开Tab键开始后输入,后面也有;
本文就讲解一下makefile工具的使用。
3.实践:
这节课中使用上节课原有的文件calc.c、calc.h、calcmain.c3个文件(),先清空掉其它文件,,再创建Makefile文件,步骤如下:
1>创建Makefile文件,并输入如下内容:
calc:calc.o calcmain.o gcc -Wall calc.o calcmain.o -o calccalcmain.o:calcmain.c gcc -Wall -c calcmain.c -o calcmain.ocalc.o:calc.c gcc -Wall -c calc.c -o calc.o .PHONY:clean clean: rm calc.o calcmain.o calc
上面代码其中第一行:
calc:calc.o calcmain.o:calc为生成的可执行文件对应规则的target;而calc.o calcmain.o是生成calc文件的依赖文件;
gcc -Wall calc.o calcmain.o -o calc:这就是依赖条件满足执行的命令; 同理calcmain.o:calcmain.c:calcmain.o这个目标文件要依赖于calcmain.c文件,注明:如果单修改了calcmain.c源文件,那么可用make calcmain.o和make calc命令执行生成此目标文件操作后链接生成可执行文件
gcc -Wall -c calcmain.c -o calcmain.o:生成目标文件; 最后clean是伪目标,通常情况下在其前面加上如下防止当前目录有相同的指令:
.PHONY:clean
2>现在这个Makefile文件制作好,直接输入命令make就可以完成编译工作:
make
如果想删除相关生成的文件执行:
make clean
如果单修改了calcmain.c源文件,那么单生成calcmain.o文件,在链接成可执行文件,执行如下:
make clacmain.omake calc
这样在项目文件多的时候就可以省掉很多时间了!这个命令一敲很爽吧,哈哈。。。。。。
3>细心的读者就可以想到了:竟然Makefile是shell文件,不能用变量来替换其内容多次出现的问题,这个问题真好其实这就是接下来讲的部分了。
Makefile文件第一行的calc:calc.o calcmain.o如果把后面的目标文件使用变量的话是不是可以减少维护量啊,如果可执行文件也用变量替换是不是也可以啊,这2个问题现在解决下,新版的Makefile文件如下:
EXE=calcOBJECTS=calcmain.o calc.o $(EXE):$(OBJECTS) gcc -Wall $^ -o $EXEcalcmain.o:calcmain.c gcc -Wall -c $< -o $@calc.o:calc.c gcc -Wall -c $< -o $@clean: rm -f $(EXE) $(OBJECTS)
这样使用一些预定义变量如$^就是所有依赖文件;$<就是依赖的第一个文件;$@就是当前的target对象。这样在文件较多时候就比较好维护了。
这节课就讲到这里,还有一些如预定义变量可以自己网上找找看看。