Makefile的工作流程详解

1.Makefile是什么

Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。

2.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

如图所示:
在这里插入图片描述

4.测试:

项目文件结构
$表示普通用户的shell终端

$ ls
main.c  Makefile  test.c  test.h
$ make
gcc -c main.c -o main.o
gcc -c test.c -o test.o 
gcc main.o test.o -o main
$ make clean
rm -rf *.o main
$ ls
main.c  Makefile  test.c  test.h
$ make 
gcc -c main.c -o main.o
gcc -c test.c -o test.o 
gcc main.o test.o -o main
$ ls
main  main.c  main.o  Makefile  test.c  test.h  test.o
$ ./main
please input number:
number1: 13
number2: 14
the greater one is: 14
$ ls
main  main.c  main.o  Makefile  test.c  test.h  test.o
$ make clean
rm -rf *.o main
$ ls
main.c  Makefile  test.c  test.h
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当我们运行`make`命令时,它会读取名为`Makefile`(或者`makefile`)的文件,并根据文件中的规则来构建目标。以下是Makefile的一般过程: 1. 读取Makefile:`make`命令会读取当前目录下的Makefile文件。 2. 解析规则:`make`命令会解析Makefile中的规则,包括目标、依赖关系和命令。 3. 检查依赖关系:`make`命令会检查目标和依赖关系之间的时间戳,以确定是否需要重新构建目标。如果依赖关系的时间戳比目标的时间戳要新,或者目标不存在,则需要重新构建目标。 4. 执行命令:如果需要重新构建目标,`make`命令会执行与目标关联的命令。这些命令可以是编译代码、链接对象文件或者执行任何其他构建任务。 5. 递归构建:如果目标的规则中包含了依赖其他目录下Makefile的规则,`make`命令会递归进入这些目录,并按照相同的过程解析和构建子目录中的Makefile。 6. 完成构建:一旦所有的目标和依赖关系都被构建完成,`make`命令会输出构建成功的消息并退出。 需要注意的是,Makefile中的规则是按顺序执行的,并且`make`命令会根据文件中的依赖关系图来确定构建顺序。如果存在循环依赖,`make`命令会报错并中止构建过程。 此外,Makefile还支持一些特殊的目标和变量,例如`.PHONY`目标用于声明伪目标,`.DEFAULT`目标用于定义默认规则,以及一些预定义的变量(如`$@`表示当前目标,`$<`表示第一个依赖项)等。 希望以上信息对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西里小诸葛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值