对Makefile的浅显理解1
网上有很多关于Makefile学习的文章,而且每篇文章都很有特点。只是对于我而言,还是觉得有些问题介绍的并不清楚。现在我想站在一个零基础的角度上分析,和大家一起学习Makefile。
总而言之,就是把复杂的问题简单化!
【功能介绍】MakeFile可以看做是一种简单的编程语言,其诞生的本质目的是实现自动化编译。
以Linux下gcc-c编译器为例,编译一个c语言程序需要经过以下几个步骤:
1.预处理(Pre-processing),生成预编译文件(.i文件):
gcc –E hello.c –o hello.i
2.编译(Compiling),生成汇编代码(.s文件):
gcc –S hello.i –o hello.s
3.汇编(Assembling),生成目标文件(.o文件):
gcc –c hello.s –o hello.o
4.链接(Link),生成可执行文件:
gcc hello.o –o hello
整个过程如果想一步到位:
gcc hello.c -o hello即可
【编译和链接】
要得到最后可执行的程序,首先要把源文件编译成中间代码文件,在Windows 下也就是 .obj 文件,UNIX\Linux 下是 .o 文件,即 Object File,编译(compile)。再把大量的Object File 合成执行文件,链接(link)。
编译时,编译器需要的是语法正确,函数与变量的声明正确。对于后者,通常是你需要告诉编译器头文件的所在位置,只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O 文件或是OBJ 文件)。
【工作方式】Makefile
.C文件——>.o文件——>可执行文件
如果要指定特定的Makefile,你可以使用make的“-f”和“–file”参数,如:make -f Makefile或make --file Makefile
【实例介绍】Hello程序的MakeFile
TOPDIR = ../
include $(TOPDIR)Rules.mak
EXTRA_LIBS +=
EXEC = $(INSTALL_DIR)/hello
OBJS = hello.o
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS)
install:
$(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
【解释说明】
CC 指明编译器的宏
EXEC 表示生成的执行文件名称的宏
OBJS 目标文件列表宏
LDFLAGS 连接参数宏
All: 编译主入口
Clean: 清除编译结果
Install: 将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录
【Makefile规则】
Makefile里主要包含了五个东西:
显式规则
隐含规则
变量定义
文件指示
注释
1、显式规则。
显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
如: foo.o : foo.c defs.h 依赖关系
gcc -o foo.o foo.c 生成目标的方法(方式)
2、隐含规则。
由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
如: foo.o : foo.c (.o文件自己推导出同名的依赖文件.c.)
3、变量的定义。
在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
如:H: =foo.c gcc -o foo.o $(H) (赋值可以用: =也可以直接用 =)
4、文件指示。
其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。
5、注释。
Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++,Java中的“//”一样。
在Makefile中的命令,必须要以[Tab]键开始。