9.makefile的学习
make工程管理器也就是一个“自动编译管理器”,在这里的“自动”是指它能够根据文件的时间戳自动发现更新过的文件从而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作
1.Makefile的基本结构
target:dependcy_files
commend
解释:target:需要由make工具创建的目标体,可以是目标文件或者是可执行文件
dependcy_files:目标体(target)
commend:创建目标体时所要运行的命令(每行命令必须以Tab键开头,否则报错!!!)
2.1常规编写方法
编写显示函数display.c,如下:
#include <stdio.h> void display(const char *str) { printf("The str is %s",str); }
编写display_num1()函数
#include<stdio.h> void display(const char *str); void display_num1() { display("The number is 1!\n"); }
编写display_num2()函数
#include<stdio.h> void display(const char *str) ; void display_num2() { display("The number is 2!\n"); }
编写main()函数
#include <stdio.h> void display(const char *str); void display_num1(); void display_num2(); int main() { display("Hello Linux\n"); display_num1(); display_num2(); return 0; }
2.2利用命令实现结果输出输入命令:
gcc -c main.c display.c display_num1.c display_num2.c
输入命令
gcc -o example main.o display.o display_num1.o display_num2.o
输入命令:
./example
结果如下;
2.3利用makefile实现
再上面的介绍中实现了结果的输出,但是当修改程序时,就还须重新输入以上的三个命令,这就显得操作比较冗余,用makefile来实现就不存在这个问题。
用vim编写Makefile(直接在终端输入:vim Makefile)
main:main.o display.o display_num1.o display_num2.o
gcc -o example main.o display.o display_num1.o display_num2.o
.PHONY : clean
clean:
rm main.o display.o display_num1.o display_num2.o
如图:
每次更新完函数之后,直接执行make命令即可完成更新。
执行make clean可以把目标文件(.o)移除,节省空间,执行./example即可得到运行结果,如上图所示。
2.3.makefile的简写
仔细看上述的makefile,可以看到(.o)文件要重复写三次,给编写带来很多不便,也容易出错,这时可以引用变量的模式,如下
OBJ=main.o display.o display_num1.o display_num2.o
cc= gcc -o
main:$(OBJ)
$(cc) example $(OBJ)
.PHONY : clean
clean:
rm $(OBJ)
如果增加了(.c)文件只需在OBJ里增加即可。
运行结果与上述是一致的。