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]$

项目文件结构图:四个文件在同一目录中

makefile能编译java吗 makefile怎么编译_目标文件