Makefile总结

来源:互联网 发布:索尼rx100一代知乎 编辑:程序博客网 时间:2024/04/30 21:16

Makefile

 

Part 1

1.makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译甚至更复杂的操作。

2.一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。

 

visual c++ 中的命令为nmake

Linux下的GUNmake

 

Part 2

1.无论是C、C++、还是pas, 首先要把源文件编译成中间代码文件,在Windows 下也就是 .obj 文件,UNIX 下是 .o 文件,即 Object File,这个动作叫做编译(compile)。

编译时,编译器只检查程序语法和函数、变量是否被声明

2.然后再把大量的Object File 合成执行文件,这个动作叫作链接(link)。

链接程序时,链接器会在所有的Object File中寻找函数的实现

 

Part 3

3.Makefile的规则是

1)如果这个工程没有编译过,那么我们的所有C 文件都要编译并被链接。

2)如果这个工程的某几个C 文件被修改,那么我们只编译被修改的C 文件,并链接目标程。

3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C 文件, 并链接目标程序。

4.Makefile规则:

target... : prerequisites...

command

 

目标...  :依赖文件...

命令

 

如果prerequisites中有一个及以上的文件比target文件要新的话,command所定义的命令就会被执行。

命令必须要以[Tab]键开始。

 

5.makefile中使用变量

可以声明一个变量,来代替多次重复使用的项目

如:

objects = main.o kbd.o command.o display.o \

insert.o search.o files.o utils.o

 

edit : $(objects) 

cc -o edit $(objects)

 

使用时,使用$(objects) 即可

6.自动推导

可以省略依赖文件中的.c和命令中cc -c whaerver.c。

makefile会自动识别并推导命令

 

7.清空文件目标的规则

稳健的做法是:

.PHONY : clean

clean :

-rm edit $(objects)

其中:

l rm命令前的-的意思是:也许某些文件出现问题,但不要管,继续做后面的事。

l .PHONY : clean显示地说明了clean为一个 “伪目标”;

 

Part 4

1.Makefile的组成

Ø 显示规则

Ø 隐晦规则

Ø 变量的定义

Ø 文件指示

Ø 注释

2.Makefile的文件名

  make命令会在当前目录中寻找makefile文件

  文件名最好为Makefile

3.引用其他的Makefile

  include foo.make a.mk b.mk c.mk

  先在当前工作目录下寻找,再在/usr/local/bin或者/usr/include中寻找。

也可以指定查找的目录:    -I <目录>

 

4.makefile的工作方式

1) 读入所有的Makefile。

2) 读入被include的其它Makefile。

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

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

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

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

7) 执行生成命令。

 

Part 5

1.cc 命令

 cc 类似于gcc

 -c 表示编译产生(*.obj)文件,而不链接为可执行文件

 -o 表示允许用户指定输出文件的文件名(与gcc -o类似)

2.如果命令过长,可以用\作为换行符

3.通配符的使用

  ~  :如果是“~/test”,这就表示当前用户的$HOME目录下的test目录。而“~hchen/test”则表示用户hchen的宿主目录下的test目录。

  *  :表示匹配一个字符串。

  ? :表示匹配一个字符。

  注意:通配符用于变量的时候不会展开,必须使用特殊的写法

4.文件搜寻

vpath %.h  ../headers    

在“../headers”中搜索.h为结尾的文件

5.伪目标

为了避免和文件重名的情况,我们使用.PHONY来显示地指明一个目标为伪目标

.PHONY:clean

只要有这个声明,不管是否有“clean”文件,都要运行clean这个目标

同时,我们可以利用伪目标的特性,一次生成多个可执行文件

6.多目标?????

7.静态模式??????

8.自动生成依赖性????

编译器-M选项(gcc为-MM)会自动寻找标准头文件

      gcc -MM main.c的输出是:

      main.o: main.c defs.h

 

0 0
原创粉丝点击