您的位置:首页 > 其它

Makefile学习笔记

2014-09-06 15:48 183 查看
Make 项目管理

Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,他通过读入makefile文件内容来执行大量的编译工作。

Makefile文件的作用

让编译器知道要编译一个文件需要依赖那些文件,同时当哪些依赖文件有了改变,编辑器会自动发现最终的生成文件已过时,而重新编译相应的模块。Makefile的内容规定了整个工程的编译规。Makefile定义了一系列的规则来指定,比如哪些文件是有依赖性的,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。

make的工作方式

GNU的make工作时的执行步骤入下:(想来其它的make也是类似)

1、读入所有的Makefile。

2、读入被include的其它Makefile。

3、初始化文件中的变量。

4、推导隐晦规则,并分析所有规则。

5、为所有的目标文件创建依赖关系链。

6、根据依赖关系,决定哪些目标要重新生成。

7、执行生成命令。

1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完 全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。

Makefile的基本机构

Makefile是make读入的配置文件,主要由以下三部分组成

1、由make工具创建的目标体,通常是目标文件或可执行文件(目标)

2、要创建的目标体所依赖的文件(依赖)

3、创建每个目标体所需要的命令(规则)

*命令行面前必须是一个“TAB”健。

Example

Myprog:kang.o yul.o

Gcc kang.o yul.o -o myprog

Kang.o:kang.c kang.h

Gcc -Wall -O -g -c kang.c -o kang.o

Yul.o :yul.c yul.h

Gcc -Wall -O -g -c yul.o

* -Wall:表示允许发出gcc所有有用的报警信息

-c :只是编译不链接,生成目标文件”.o”

-o file:表示把输出文件输出到file里

Install:

Cp Myprog /home/tmp

Clean:

Rm -f *.o

上面Makefile例子中,定义了一个伪目标clean,它规定了make应该执行的命令,即删除所有编译过程中产生的中间文件。当make处理到伪目标clean时,它会先查看其对应的依赖关系。由于为目标clean没有任何依赖文件,所有make命令会认为该目标是最新的而不会执行任何操作。为了编译这个目标体,必须手工执行如下命令。

#make clean

另一个常用到的伪命令就是install。它通常将编译完成的可执行文件或程序运行所需的其他文件复制到指定的安装目录。

上例执行

#make install

就会将生产的目标文件Myprog复制到 /home/tmp目录下

Makefile的执行过程

执行make命令时,会首先处理Myprog所有依赖文件(.o文件)的更新规则,对于.o文件,会检查每个依赖程序(.c和.h文件)是否有更新,判断有无更新的依据主要是看依赖文件的建立时间是否比生成的目标文件晚,如果是,那么会按规则重新编译生成相应的目标文件,接下来对于最终的可执行程序,同样会检查其依赖文件(.o文件)是否有更新,如果有任何一个目标文件要比最终可执行的目标程序新,则重新链接成新的可执行程序。

Makefile变量

创建和使用变量

u 变量的两种定义 方式

递归张开方式VAR=var

简单方式VAR:= var

u 变量使用($VAR)

u 用$表示

u 类似C语言中的宏

上述例子可写成

OBJS = kang.o yul.o

CC =gcc

CFLAGS = -Wall -O -g

Myprog :$(OBJS)

$(CC) $(OBJS) -o myprog

Kang.o:kang.c kang.h

$(CC) $(CFLAGS) -c kang.c kang.o

Yul.o:yul.c yul.h

$(CC) $(CFLAGS) -c yul.c -o yul.o

递归展开例子

Foo = $(bar)

Bar = $(ugh)

Ugh = Hub

$(foo)的值为 Hub

为变量添加值

用“+=”为已定义变量添加新的值

Main = hello.o hell-1.o

Main += hello-2.o

则Main为

Hello.o hello-1.o hello-2.o

变量的种类

用户自定义变量

预定义变量

AR AS CC CPP CXX FC RM

自动变量

环境变量

Makefile 使用

直接使用make

选项:

-C dir :读入指定目录的makefile

-f file:读入当前目录下文件名为file的Makefile

-i :忽略所有的命令执行错误

...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: