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 :忽略所有的命令执行错误
...
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 :忽略所有的命令执行错误
...
相关文章推荐
- Makefile学习笔记4:Makefile的一些模板
- makefile学习笔记(二)
- Makefile的学习笔记
- u-boot-1.1.6 学习笔记——顶层目录 Makefile
- Makefile学习笔记
- linux环境arm裸机程序学习笔记1----makefile,中断,下载程序方法
- Makefile学习笔记
- Makefile 学习笔记 (1)
- Makefile学习笔记 - 我的CPP之路 - C++博客
- Linux Makefile学习笔记
- Makefile学习笔记3:Linux下makefile基础 (zz)
- linux学习笔记-读《Linux编程技术详解》(2)-make与makefile
- makefile学习笔记
- makefile学习笔记
- 学习笔记——Makefile中的=与:=
- Makefile学习笔记1:Linux平台Makefile文件的编写基础篇(zz)
- 操作系统学习笔记(5)--makefile文件实例
- 笔记:学习vc之makefile
- android 学习笔记(八)底层8.2 学习makefile 其中的函数
- 2012.2.29 linux学习笔记 gcc makefile的使用