您的位置:首页 > 其它

工程管理器make

2016-07-11 11:00 134 查看


一.工程管理器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



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