C语言makefile使用(进阶篇)

记录一下使用makefile的心得体会,部分内容来源《gun make中文使用手册》,作者 徐海兵

1.准备知识

为什么要使用makefile,C语言源码是.c文件,汇编处理后生成.o文件,.o文件链接后生成可执行文件,在汇编过程中,可能需要处理多个.c和.h文件,且这些文件都放在另外一个文件夹里面。所以对于大型项目,需要使用makefile来构建和管理工程。

2.目录结构

3.makefile文件源码

初始目录情况

上代码

当前目录下的makefile文件

#源码管理
#*.c ->src
#*.o ->obj

SRCDIR = ./src
OBJDIR = $(shell pwd)/obj
SRC = $(wildcard $(SRCDIR)/*.c)
OBJ = $(patsubst %.c, $(OBJDIR)/%.o, $(notdir $(SRC)))

CC = gcc
CFLAGS = -c -g -Wall -I /opt/lv3/d19/test1/include/
export CC CFLAGS OBJ OBJDIR
all:$(SRCDIR) ECHO test
$(SRCDIR):ECHO
        make -C $@ 
ECHO:
        @echo $(SRCDIR)
        @echo "begin.................."
        @echo $(OBJ)
test:$(OBJ)
        $(CC) $^ -o $@
        
#伪目标
.PHONY:clean
clean:
        $(RM) $(OBJDIR)/*.o

 src下的Makefile

all:$(OBJ)
$(OBJDIR)/%.o:%.c
        $(CC) $(CFLAGS) $^ -o $@

4.源码解析

./下的makefile文件主要是功能是

1.去src目录执行该目录下的makefile文件,

2.传一些参数给src下的makefile,

3.依赖.o文件生成可执行文件test。

SRCDIR = ./src #定义变量 存储源码路径
OBJDIR = $(shell pwd)/obj #定义变量 存储.o文件存储路径,这里使用了shell函数,函数“shell”的参数在 shell 中的执行结果
SRC = $(wildcard $(SRCDIR)/*.c)#定义一个变量,存储源码文件名称
#./src/fun1.c ./src/fun2.c ./src/fun.c
#函数功能:列出当前目录下所有符合模式“PATTERN”格式的文件名。
#返回值:空格分割的、存在当前目录下的所有符合模式“PATTERN”的文件名。

#$(wildcard $(SRCDIR)/*.c)
#返回值为SRCDIR目录下所有.c 源文件列表。

OBJ = $(patsubst %.c, $(OBJDIR)/%.o, $(notdir $(SRC)))

#$(patsubst PATTERN,REPLACEMENT,TEXT)
#搜 索 “ TEXT” 中 以 空 格 分 开 的 单 词 , 将 否 符 合 模 式 “ TATTERN” 替 换 为
“REPLACEMENT”。

#示例:
#$(patsubst %.c,%.o,x.c.c bar.c)
#把字串“x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。函数的返回结果是“x.c.o
#bar.o

CC = gcc #存储一个变量 gcc的命令
CFLAGS = -c -g -Wall -I /opt/lv3/d19/test1/include/
#创建一个变量 存储 执行gcc的命令 和要执行的头文件的路径
#这两个变量后面会用到
all:$(SRCDIR) test
#执行了一个伪目标,该目标主要是执行 2个命令 $(SRCDIR) test
#Makefile 中第一个目标是“终极目标”,约定的做法是使用一个称为“all”的伪目标来作为终极目标,它的依赖文件就是那些需要创建的程序。

 all伪命令先执行$(SRCDIR) 

$(SRCDIR):ECHO
        make -c $@ 
#make -c src  去执行src下的makefile

 src/makefile文件代码

all:$(OBJ) 
$(OBJDIR)/%.o:%.c
        $(CC) $(CFLAGS) $^ -o $@
# all伪目标 依赖文件 OBJ /opt/lv3/d19/test1/obj/fun1.o /opt/lv3/d19/test1/obj/fun2.o /opt/lv3/d19/test1/obj/fun.o

#$(OBJDIR)/%.o:%.c 将.c文件生成到/opt/lv3/d19/test1/obj/下的.o文件

#$(CC) $(CFLAGS) $^ -o $@   gcc -c -g -Wall -I /opt/lv3/d19/test1/include/fun1.c -o /opt/lv3/d19/test1/obj/fun1.o

#OBJ  OBJDIR CC CFLAGS都是项目目录下的makefile通过export传过来的值

#$^依赖文件名  $@所有目标文件名

把src目录下的.c文件生成.o文件,把.o文件放到obj文件夹下面

 src/makefile的文件都执行完成,这时候obj文件夹下的.o文件都有了回到目录下的makefile文件,

执行test段代码

all:$(SRCDIR)  test
$(SRCDIR):ECHO
        make -C $@ 
ECHO:
        @echo $(SRC)
        @echo "begin.................."
        @echo $(OBJ)
test:$(OBJ)
        $(CC) $^ -o $@

#OBJ 代码.o文件名
#$(CC) $^ -o $@
#gcc /opt/lv3/d19/test1/obj/fun1.o /opt/lv3/d19/test1/obj/fun2.o /opt/lv3/d19/test1/obj/fun.o -o test  执行命令 将.o文件链接成test文件

 最终目录情况

 最后还写了个清除 test文件和.o文件的命令

#伪目标
.PHONY:clean
clean:
        $(RM) $(OBJDIR)/*.o
        $(RM) test

#rm -f /opt/lv3/d19/test1/obj/*.o
#rm -f test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值