Makefile
Part 1
1.makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译甚至更复杂的操作。
2.一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。
visual c++ 中的命令为nmake
Linux下的GUN的make
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