参考自:Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码_哔哩哔哩_bilibili
注: 视频中用的是C++,博主这里用C语言实现
喜欢老师的于老师的还请多多点赞,觉得博主写得不错的,也可以点赞、收藏哦
本文我们将用四个版本的makefile文件带你入门
文件准备:
一个 空的文件夹下面 存放以下文件 :
除了Makefile文件,其他文件基本不改动(可能会加上几个空格 --> 修改编辑时间)
hello.c
jic.c
func.h
main.c
接下来让我们来修改一下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 开头,后续接着执行的命令
------------------------
编译
编译一次结果:
这时候 马上编译的话就 报错 -- 如图
是因为我们 的 生成的 hello 已经 很新了,比他的所有依赖文件都要新, 没必要进行make了
if此时末尾修改以下其他依赖文件 -- 那么他 就不是最新的 就口语make了,如下图
========================、
版本二
特点 -- 写得更加的注重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.chello.o:hello.c
$(CC) -c hello.cjic.o:jic.c
$(CC) -c jic.c
编译
编译结果:
假如我们此时去修改 其中一个依赖文件 , 会发现他只会去编译 被修改的文件,比如我们修改 jic.c, 如下图 只会 -c 编译jic.c
优势
这样可以节约编译 时间
------------------------------------
版本三:
版本三和版本四是代码上的优化,这里就不演示编译了
# VERSION3
CC = gcc
TARGET = hello
OBJ = main.o hello.o jic.oCCFLAGS = -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这个文件的情况,会执行失败
如果想更详细了解这些函数的请看这篇: 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博客