Makefile的工作流程
Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。
场景:我们有多个源文件需要编译,那么就可以通过编写Makefile文件,在Makefile中描述好应该如何编译,然后通过make指令一键编译。(Makefile文件的名字就是Makefile)
1.Makefile文件的编写规则:
targets:prerequisites
command #要执行的命令
参数说明:
targets #目标文件,要生成的文件
prerequisites#前置条件,要生成目标文件需要做的准备,前置条件可以为空
command #执行该命令可生成目标文件
总结:
在前置条件下,执行command命令,生成targets目标文件
注意:一个Makefile文件可能由无数条的目标文件:前置条件组成,默认第一条的targets为最终可执行文件。
2.如何清理main.o,test.o这样的中间文件
在Makefile文件尾加上:
.PHONY:clean
clean:
rm -rf *.o
然后在shell终端执行make clean指令即可。
3.实践操作
现在我们来编写一个简单的程序进行测试,首先准备创建main.c,test.c,test.h,Makefile四个文件(四个文件在同一目录中)。
项目逻辑思路:
main.c:是主程序,里面有main函数,在main函数中调用max(int,int)函数,判断并输出用户输入的两个数字中较大的数。
test.c: 该文件用来放max函数的实现
test.h:该文件用来放max函数的声明
Makefile:说明整个项目的构建规则,最后make将根据该文件对项目进行构建。
各个文件的源码如下:
main.c文件:
#include<stdio.h>
#include"test.h"
int main()
{
int x,y;
int res;
printf("please input number:\n");
printf("number1: ");
scanf("%d",&x);
printf("number2: ");
scanf("%d",&y);
res=max(x,y);
printf("the greater one is: %d\n",res);
return 0;
}
test.h文件:
int max(int,int);
test.c文件
#include"test.h"
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
Makefile文件
main:main.o test.o
gcc main.o test.o -o main
main.o:main.c test.h
gcc -c main.c -o main.o
test.o:test.c test.h
gcc -c test.c -o test.o
#以下语句是清理编译过程中出现的中间件,main为最终的可执行文件
.PHONY:clean
clean:
rm -rf *.o main
测试:
[zsh@localhost dotest]$ ls
main.c Makefile test.c test.h
[zsh@localhost dotest]$ make
gcc -c main.c -o main.o
gcc -c test.c -o test.o
gcc main.o test.o -o main
[zsh@localhost dotest]$ make clean
rm -rf *.o main
[zsh@localhost dotest]$ ls
main.c Makefile test.c test.h
[zsh@localhost dotest]$ make
gcc -c main.c -o main.o
gcc -c test.c -o test.o
gcc main.o test.o -o main
[zsh@localhost dotest]$ ls
main main.c main.o Makefile test.c test.h test.o
[zsh@localhost dotest]$ ./main
please input number:
number1: 13
number2: 14
the greater one is: 14
[zsh@localhost dotest]$ ls
main main.c main.o Makefile test.c test.h test.o
[zsh@localhost dotest]$ make clean
rm -rf *.o main
[zsh@localhost dotest]$ ls
main.c Makefile test.c test.h
[zsh@localhost dotest]$
项目文件结构图:四个文件在同一目录中