通过一个简单的例子来了解掌握Makefile

makefile的作用

简单了解makefile文件的作用:

  • 描述了软件包中文件之间的关系,提供更新每个文件的命令
  • 执行make命令可以自动构建整个项目
  • 提高项目构建的可靠性和高效性,更容易维护

makefie规则的一般形式

target:dependency dependency
	(tab)<command>
//target:需要创建的二进制文件或目标文件
//dependency:在创建target时需要用到的一个或多个文件的列表
//command:命令序列是创建target文件所需要执行的步骤

看不懂没事,下面通过例子就理解了

一个简单的makefile

1.通过vi/vim命令创建编写文件

先创建需要的.h头文件和.c源文件

  • hello.h
// 此处做一个函数声明
void hello(); 
  • hello.c
#include "hello.h"
#include <stdio.h>
void hello()
{
	printf("Hello World!"); 
}
  • main.c
#include "hello.h"
#include <stadio.h>
int main()
{
	hello();
	return 0;
}
  • 继续编写makefile文件
    以下定义了四个目标:test、main.o、hello.o和clean
    😃 冒号(:)后面是与该目标有依赖性的目标或者文件
    😃 比如第三行"main.o:main.c hello.c "表示main.o的依赖文件是main.c和hello.c,如果这些依赖文件的时间戳比main.o的新,那么make就会执行第四行命令gcc -c main.c -o mian.o命令来,更新mian.o文件
    hello.o也是类似操作
    以下展示首次执行的嵌套过程
test: main.o hello.o            //1.检查test的时间戳
	gcc -o test main.o hello.o  //6.执行命令:将mian.o和hello.o连接成目标文件test
main.o: main.c hello.h          //2.找到main.o的规则检查其时间戳
	gcc -c main.c -o mian.o    //3.运行命令
hello.o: hello.c -o hello.o    //4.找到hello.o的规则检查其时间戳
	gcc -c hello.c -o hello.o  //5.运行命令
clean:                         //7.删除所有目标快
	rm -f *.o     
  • 运行结果(输入make命令)
    观察语句的执行顺序

在这里插入图片描述

为什么要这样做

可能会有人有这样的疑问:这么简单的.c和.h文件问什么还要写个makefile文件将其形成嵌套关系呢?
但是当项目比较大的时候,头文件就不仅仅只有一个,这时候改变一个头文件,可能会影响其他文件,此时,make可以自动的重新编译所有那些因依赖这个头文件而改变了的源码文件,如果需要,再进行重新连接。可维护性是不是体现了

接下来看一下化简过程

此外可以使用变量来写makefile(化简)

很简单,就是个变量代换的过程

隐含规则(继续化简)

有时候你觉得命令写得很麻烦,此时可以利用隐含规则,就算你没有完整给出命令,make也知道该怎么执行

一些变量的含义,简单看一看就好

  • $@ 扩展为当前规则的目标文件名
  • $< 扩展为依赖文件列表中的第一个依赖文件
  • $^ 扩展为全部依赖文件列表,除去重复的文件
  • $* 不包含扩展名的目标文件名
  • $? 所有时间戳比目标文件晚的依赖文件
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值