学不会 Makefile?那是因为你还没看这篇文章!

前言:编译命令敲累了?是时候学点自动化了!

哈喽大家好,我是小康!

上次我们聊了 GCC、G++ 和 GDB,搞清楚了这些工具在 C/C++ 开发中的用法。有了它们,你已经可以愉快地编译、调试代码了。

但我问你,每次编译项目是不是手动敲 gcc 命令? 当项目文件一多,命令就像绕口令一样——又长又复杂,还特别容易出错。
别怕,今天我就带你认识一个“懒人神器”——Makefile

用 Makefile 的好处很简单:

  • 代码编译自动化,轻松又高效;
  • 不用手动敲命令,少掉坑;
  • 项目多大都不怕,它全能搞定。

只要学会写 Makefile,编译这种枯燥的事情,再也不用你操心!让我们从零开始,一步步带你搞清楚它是啥、怎么写,看完就能用!

友情提醒:原创不易,如果觉得内容对你有帮助,别忘了 点赞、收藏、关注 支持一下!非常感谢!

微信搜索 【跟着小康学编程】,关注我公众号,定时分享计算机编程硬核技术文章。

1、什么是 Makefile?

Makefile 就是一个编译指挥官,你把编译规则写在里面,之后用一条简单的命令 make,它就会按照规则自动完成所有的编译任务。

打个比方,你是项目经理,Makefile 就是你的笔记本,记录着项目的“施工计划”:

  • 每个目标(比如可执行文件 main)的来源(哪些源文件);
  • 这些目标要用什么命令生成;
  • 有哪些需要重复利用的部分(比如中间文件 *.o)。

一句话:Makefile 帮你自动化处理那些又多又烦的编译流程!

2、为什么用 Makefile?

假设你有两个源文件:main.cutils.c,手动编译步骤大概是这样:

  1. 先把 main.cutils.c 分别编译成目标文件:
gcc -c main.c -o main.o
gcc -c utils.c -o utils.o
  1. 再把目标文件链接成可执行文件:
gcc main.o utils.o -o main

看着简单,但代码一多,命令就会变成这样:

gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
gcc -c file3.c -o file3.o
...
gcc file1.o file2.o file3.o -o my_program

多打一条命令,多一个机会掉坑;一改代码,又得全编译一遍,时间都浪费了。
用 Makefile,只需要:

make

一条命令,全搞定!而且它还会只编译改动的文件,效率直接起飞。

简单理解:

  • 没有 Makefile:自己手敲命令,累。
  • 有了 Makefile:只用一句 make,剩下的事全自动完成,爽。

3、Makefile 的基本结构 (一分钟搞懂)

Makefile 是由一组 规则(rule)组成的,每个规则都包含三部分:

  1. 目标(target):你想要生成的文件,比如 main
  2. 依赖(dependencies):目标文件需要哪些源文件或头文件。
  3. 命令(commands):生成目标需要运行的命令。

举个例子:

main: main.o utils.o
	gcc main.o utils.o -o main
  
main.o: main.c
    gcc -c main.c

utils.o: utils.c
    gcc -c utils.c

什么意思呢?

上面总共 3 条规则,来说说第一条规则:

  1. 目标是 main,表示我们要生成一个叫 main 的可执行文件。
  2. 依赖是 main.outils.o,也就是说生成 main 需要这两个依赖文件先生成,而这两个依赖是利用规则 2 和 规则 3 生成的。
  3. 命令是 gcc main.o utils.o -o main,它负责把 .o 文件编译成最终的可执行文件。

后两条规则类似,告诉 make 怎么生成 main.outils.o

简单吗?这就相当于告诉 Makefile:“你要先准备好 main.outils.o,然后用 gcc 链接它们。”

4、Makefile 基础功能:让编译自动化从这里开始

4.1 自动生成目标文件

如果你每次都向上面一样手写 main.outils.o 的生成规则,那 Makefile 就会变得非常繁琐和重复。好消息是,Makefile 支持通配符,可以自动生成规则!

%.o: %.c
	gcc -c $< -o $@
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值