Makefile 快速入门

参考自:Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码_哔哩哔哩_bilibili

注: 视频中用的是C++,博主这里用C语言实现

喜欢于老师的还请多多点赞,觉得博主写得不错的,也可以点赞、收藏哦

 

 

本文我们将用四个版本的makefile文件带你入门

 

文件准备: 

 一个 空的文件夹下面 存放以下文件 :

4e60992a81a14f8b92aa2beb7e22d08e.png

除了Makefile文件,其他文件基本不改动(可能会加上几个空格 --> 修改编辑时间)

hello.c

256bb2c510df4af3b598c9bd478a60d7.png

 

jic.c

33e17cc14c1f48b7952bd18d6dac4677.png

 

func.h

bf8aae74e5bf4eba858021da3161bde7.png

 

main.c 

d249dd517b454d9799a4e5ee5d02ded8.png

 

接下来让我们来修改一下makefile文件吧

 

版本一:

 

VERSUION 1


hello : main.c hello.c jic.c
    gcc -o hello main.c hello.c jic.c

解读: 


hello: 生成这个目标


hello.c jic.c   --  目标的依赖文件
    gcc -o hello main.c hello.c jic.c --   命令 ,注意tab 开头,后续接着执行的命令


------------------------

编译

编译一次结果:

dded1d55a10048f7b8200a3554247770.png

 


这时候 马上编译的话就 报错  -- 如图

715d1dc3e0954e64a0210b4c70dc37df.png

是因为我们 的 生成的 hello 已经 很新了,比他的所有依赖文件都要新, 没必要进行make了
if此时末尾修改以下其他依赖文件 -- 那么他 就不是最新的 就可以make了,如下图
 

e5c7b8d0b36a40aaa217a8bf356ad69b.png

 

========================、

版本二

 

特点 -- 写得更加的注重makefile格式  

选项  -c 编译或汇编源文件,但不链接  -- 生成.o 文件

# VERSUION 2  

CC = gcc
TARGET = hello
OBJ = main.o hello.o jic.o

$(TARGET): $(OBJ)
    $(CC) -o $(TARGET) $(OBJ)


main.o:main.c
    $(CC) -c main.c

hello.o:hello.c
    $(CC) -c hello.c

jic.o:jic.c
    $(CC) -c jic.c    

编译

编译结果:

84ae58d49ae04c1da2f0c6793b5dfcc0.png

 

假如我们此时去修改 其中一个依赖文件 ,  会发现他只会去编译 被修改的文件,比如我们修改 jic.c, 如下图 只会 -c  编译jic.c

82caf686a7b445b3ba98f0a47d103a22.png


 优势 

  这样可以节约编译 时间

------------------------------------

 版本三: 

 

版本三和版本四是代码上的优化,这里就不演示编译了


# VERSION3

CC = gcc
TARGET = hello
OBJ = main.o hello.o jic.o

CCFLAGS = -c -Wall

$(TARGET): $(OBJ)
    $(CC) -o $@ $^

%.o : %.c
    $(CC) $(CCFLAGS) $< -o $@

.PHONY: clean
clean: 
    rm -f *.o $(TARGET)

 

 


-----------------------------------

解读:

 添加一个变量去存放他的选项  -->  CCFLAGS = -c -Wall
-Wall  --> 把所有的文件中的警告都输出 ,不加的话会 忽略掉一些小的警告
$(CC) -o $@ $^

 $^ --   所有依赖文件  -- main.c hello.c jic.c
$@  -- 生成目标文件  --    hello 

%.o : %.c
    $(CC) $(CCFLAGS) &< -o &@

//  % --> 通配符 把所有的依赖 .c文件 -- 匹配到
 &< -- 上一个依赖文件 对应我们这里的  %.c 
$(CC) $(CCFLAGS) &< -o &@  --> gcc -c -Wall  main.o hello.o jic.o -o hello  

 .PHONT clean 的作用  --> 防止文件目录下面 有一个文件叫clean  ,
如图,这是没加的时候,并且有clean这个文件的情况,会执行失败

9efb683124c241b5a584d41346dc8b3e.png

 

 

如果想更详细了解这些函数的请看这篇: Makefile 规则-CSDN博客

 

优势

更加模块化 

后续要添加文件 就在,前面复赋值那里加  OBJ = main.o hello.o jic.o

=====================

版本四


#VERSION4

 


CC = gcc
TARGET = hello
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))

CCFLAGS = -c -Wall

$(TARGET): $(OBJ)
    $(CC) -o $@ $^

%.o : %.c
    $(CC) $(CCFLAGS) $< -o $@

.PHONY: clean
clean: 
    rm -f *.o $(TARGET)


----------------------------------

 优势

运用到函数大大优化代码,包括


SRC = $(wildcard *.c)  -- 通用匹配函数 让我们新加文件也不用修改Makefile

OBJ = $(patsubst %.c,%.o,$(SRC)) -- 替换函数,避免了手动输入

 

好的,看到这里相信你已经对makefile有了一定了解,关系你入门了makefile
想要更多的去进阶请看这篇: Makefile 规则-CSDN博客


 

 

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值