记录一下使用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