关于Makefile介绍内容非常之多,本文通过一个简单的可用的Makefile文件阐述了Makefile的基本原理。通过编写Makefile文件,程序员可以良好的组织程序结构,方便、快捷的进行源代码的编译、连接。
Makefile可以简单的认为就是通过配置代码文件的依赖关系、编译条件、自动检查更新文件,方便得生成可执行文件或者目标文件。Makefile实际上就是一条一条执行编译命令。
通常在我们的程序编写中,通过含有.h头文件和与之对应的.c文件,然后在.c文件中包含.h文件,这就是一个依赖关系。然后通过gcc命令和编译选项生成目标文件。
比如:gcc –Wall –g main.c –o main
这条命令里面包含了:
编译选项-Wall –g
依赖文件 main.c
目标文件main
如果main.c 中调用了其他.o文件中的函数,那么还需要将这些文件进行连接。
给出一个基本的Makefile进行讲解。
CC=gcc DEBUG=-g CFLAGS=-Wall $(DEBUG) -O2 -c LFLAGS=-Wall $(DEBUG) OBJ=main.o FileParse.o sidstring.o mem.o PROGS=readfile main:${OBJ} $(CC) $(LFLAGS) $(OBJ) -o $@ main.o:main.c $(CC) $(CFLAGS) $< FileParse.o:FileParse.c $(CC) $(CFLAGS) $< sidstring.o:sidstring.c $(CC) $(CFLAGS) $< mem.o:mem.c $(CC) $(CFLAGS) $< clean: rm -rf *.o rm -rf readfile |
其中CC DEBUG CFLAGS LFLAGS都为默认的变量。
Main.c:main.o $(CC) $(CFLAGS) $< |
冒号前面的为目标文件,后面的为依赖列表文件
紧跟着的为编译命令(注意:前面是个tab字符,不是空格)。
我们需要生成的程序为:PROGS readfile;这个主程序依赖于目标文件$(OBJ),通过连接这些目标文件,生成readfile,采用LFLAGS连接变量。
Main.o目标文件依赖于main.c,需要对于 main.c进行编译,采用CFLAGS编译变量。
再通过make运行的过程中,会对其中的变量进行替换$(变量名)。