一.工程管理器make的简介
1. 为什么需要工程管理?作用是什么?
需要工程管理的原因:
源文件越多,gcc命令行会越长;编译规则会加大gcc命令行的复杂度;
使用gcc命令行编译程序时,会把没有修改的源程序再编译一次,影响编译效率。
作用:
提高编译程序的效率
2. 什么是自动编译?时间戳?
自动编译:在整个编译过程中无需人工干预。
时间戳:文件修改时间
3. Makefile文件的作用是什么?
makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
二.Makefile文件编写语法
1. Makefile文件的组成(目标、依赖、命令)
需要生成的目标文件
生成目标文件所需要的依赖文件
生成目标文件的编译规则命令行
2. Makefile文件格式
目标文件 : 依赖文件
[Tab]command
3. 什么是伪目标?.PHONY?伪目标作用?
伪目标:不会生成一个文件,只用来执行命令,有时称为标签。
PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。
使用PHONY 目标的原因:
(1).避免和同名文件冲突。phony目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索,改善性能。
(2).如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。例如:
clean:
rm *.o temp
因为"rm"命令并不产生"clean"文件,则每次执行"makeclean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有依赖文件,文件"clean"始终是最新的,命令永远不会执行;为避免这个问题,可使用".PHONY"指明该目标。
如:
.PHONY :clean
这样执行"makeclean"会无视"clean"文件存在与否。
完整的例子如下:
.PHONY :clean
clean :
rm *.o temp
phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
all : demo1demo2 demo3
.PHONY :all
demo1 :demo1.o
gcc -o demo1 prog1.o
demo2 : demo2.o
gcc -o demo2 demo2.o
demo3 : demo3.o
gcc -o demo3 demo3.o
假设你的一个项目最后需要产生两个可执行文件。你的主要目标 是产生两个可执行文件,但这两个文件是相互独立的——如果一 个文件需要重建,并不影响另一个。你可以使用“假象目的”来 达到这种效果。一个假象目的跟一个正常的目的几乎是一样的, 只是这个目的文件是不存在的。因此, make 总是会假设它需要被生成,当把它的依赖文件更新后,就会执行它的规则里的命令行。
make clean清除编译结果
4. make clean, make install, make all的实现
make clean清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
make install将编译成功的可执行文件安装到系统目录,一般为/usr/local/bin目录。
make就是make all编译用的, 根据Makefile文件编译源代码、连接、生成目标文件、可执行文件。
5. Makefile变量,默认变量的使用
在Makefile文件中,存在大量的文件名,而且这些文件名都是重复出现的。所以在源文件比较多的情况下,很容易发生遗漏或写错文件名。而且一旦源文件的名称发生变化,还容易造成与其他文件名不一致的错误。于是,Makefile提供了变量来代替文件名。
变量的使用方式为:$(变量名)
变量的定义方式有四种:
a) 通过“=”来实现:
a1 = $(a2)
a2 = a.o
这种方式可防止出现死循环的情况。
b) 通过“:=”来实现:
a1 := a.o àa1=a.o VS a2 := $(a1) b.oàa2=b.o
a2 := $(a1) b.oàa2=a.o b.o a1 := a.oàa1=a.o
这种方式下,前面的变量不能通过后面的变量来定义。
c) 通过“+=”来实现:
a1 = a.o
a1 += b.oàa1=a.o b.o
实现变量的追加值
d)通过“?=”来实现:
a1 = a.o
a1 ?= b.oàa1=a.o
这种方式下,如果a1在之前已经定义过,则后面的定义无效。
6. make –f 的使用(配置Makefile)
make –f Makefile1指定make依赖于Makefile1进行编译
7. 多文件Makefile的编写
Makefile(脚本文件)—是一种脚本语言,因为是批处理,一般用来做测试文件,常用语言有Python,shell…
Makefile放在顶层目录,功能目录,scripts目录下
*顶层目录:总控Makefile,进入各功能目录中执行make命令,将所有的.o文件链接生成可执行文件
*功能目录:将src目录下的.c文件编译生成.o文件
*scripts目录:定义许多变量(提高Makefile的灵活性和维护性,相当于C语言中的头文件)
Makefile查看顺序:scripts目录--à总控目录--à功能目录
此处用+ - * /为例
Makefile文件:
make make clean命令:
三.标准工程目录的构成与Makefile的编写
此处用+ - * /为例(包含模板和非模板)
首先,建立好工程文件夹cal,目录结构如下:
scripts目录下的Makefile:
总控目录下的Makefile:
功能子目录下的Makefile:
make命令
make clean