对Makefile的浅显理解1

对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]键开始。

猜你喜欢

转载自blog.csdn.net/weixin_46259642/article/details/113546048