1.首先,把源文件编译生成中间代码文件,Windows下.obj文件,unix下.o文件,即Object File。这个动做叫编译(compile)函数
把大量的Object File合并执行文件,叫作连接(link)ui
2.在编译时,编译器只检测程序语法、函数、变量是否被申明。若是函数为被申明,编译器会给出一个警告,但能够生成object File。spa
而在连接程序时,链接器会在全部的object File中寻找函数的实现,若是找不到,就会报连接错误码(link ERROR)命令行
Makefile的规则:unix
target:prerequisite //target:目标文件,prerequisite :就是要生成那个target所需的文件或是目标调试
command //command也就是make所需执行的命令。注意:这一行必定是一个Tap键做为开头。code
例:blog
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.oget
3. .PHONY:clean //表示“.PHONY”表示,clean是个伪目标文件编译器
clean: //clean不是一个文件,只是一个动做名字,像C语言中的lable同样,其冒号后什么都没有,make不会自动去找文件的依赖性,要执行其后面的命令,就要在make命令后明显得指出这个lable的名字。即:“make clean”
rm edit $(objects)
4.每一个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不只便于重编译,也很利于保持文件的清洁。这是一个“修养”
通常的风格都是:
clean:
rm edit $(objects)
更为稳健的作法是:
.PHONY : clean
clean :
-rm edit $(objects) //。而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续作后面的事
不成文的规矩是——“clean历来都是放在文件的最后”。
5.Makefile中只有行注释,其注释是用“#”字符,若是你再Makefile中使用“#”字符,可使用反斜框进行转义,如“\#”
make的工做方式
GNU的make工做时执行步骤以下:
1.读入全部的makefile。 2.读入被include的其它makefile。 3.初始化文件中的变量。 4.推导隐晦规则,并分析全部规则。 5.为全部的目标文件建立依赖关系链。 6.根据依赖关系,决定哪些目标要从新生成。 7.执行生成命令。
1-5 步为第一个阶段, 6-7 为第二个阶段。第一个阶段中,若是定义的变量被使用了,那么,make 会把其展开在使用的位置。但 make 并不会彻底立刻展开, make 使用的是拖延战术,若是变量出如今依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。
规则说明:
targets : prerequisites
command
...
或是这样:
targets : prerequisites ; command
command
...
command 是命令行,若是其不与“target:prerequisites”在一行,那么,必须以[Tab键]开头,若是和 prerequisites 在一行,那么能够用分号作为分隔。
若是你的 Makefile 须要一口气生成若干个可执行文件,但你只想简单地敲一个 make 完事,而且,全部的目标文件都写在一个 Makefile 中,那么你可使用“伪目标”这个特性:
all : prog1 prog2 prog3 .PHONY : all prog1 : prog1.o utils.o cc -o prog1 prog1.o utils.o prog2 : prog2.o cc -o prog2 prog2.o prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o
编译器支持“-M”选项,表示自动找寻文件中包含的头文件。
如:gcc -M main.c
make执行时,带入make参数“-n”或“--just-print”,那么其只是显示命令,但不会执行命令,这个功能颇有利于咱们调试makefile。看看咱们书写的命令执行顺序。
make参数“-s”或“--slient”,则全面禁止命令的显示。。。
须要注意的是,若是你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。 好比你的第一条命令是 cd 命令,你但愿第二条命令得在 cd 以后的基础
上运行,那么你就不能把这两条命令写在两行上。
示例一: exec: cd /home/hchen pwd 示例二: exec: cd /home/hchen; pwd
当咱们执行“make exec”时,第一个例子中的 cd 没有做用,pwd 会打印出当前的 Makefile目录,而第二个例子中, cd 就起做用了, pwd 会打印出“/home/hchen”。