2012年(10)
分类: Python/Ruby
2012-10-22 21:39:56
编译:一般来说C、C++首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX /linux下是 .o 文件,即 Object File,这个动作叫做编译(compile)。
编译的过程还包括:(1)预处理处理器处理 (2)解析(这一步将产生大量的警告或错误,如果有的话)
链接(linker):把大量的Object File合成可执行文件。
其过程可表示为:
sourceàcompileàobject codeàlinkerßlibraries
||
Executable
Makefile使make命令编译和链接程序的规则:
1、如果这个工程没有编译过,那么我们的所有C 文件都要编译并被链接。
2、如果这个工程的某几个C 文件被修改,那么我们只编译被修改的C 文件,并链接目
标程序。
3、如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,
并链接目标程序。
Makefile的书写规则:
targets : prerequisites
command
...
或是这样:
targets : prerequisites ; command
command
...
targets:目标文件,可以是object code,也可以是Executable(可执行文件),还可以是标签(Label)可以是多个,以空格分开。
prerequisites:生成targets所需要的文件或是目标,也称为依赖。若是多个也是用空格分开。若依赖过长,还可以使用“\”换行。
command:make需要执行的命令(任意的shell)。若命令不在“targets : prerequisites”则需加上table键而不是空格,若是在同一行需用分号分隔。
Makefile的规则:
targets这一个(或多个)目标文件依赖于prerequisites(一个或多个)中的文件,其生成规则在command中。prerequisites 中如果有一个以上的文件比target 文件要新的话(被修改的时间比targets新,targets需要重新生成),command所定义的命令就会被执行。
一个最简单的makefile:
//file:hello.c
#include
int main(int argc , char **argv[])
{
printf("hello world!\n");
return 0;
}
//makefile
hello : hello.o
gcc -o hello hello.o
hello.o : hello.c
gcc -c -o hello.o hello.c
.PHONY : clean
clean:
rm hello.o hello
从这个非常简单的例子可知道一个程序编译、链接的过程。也可以看出makefile的书写规则的makefile的依赖规则及make是如何工作的。
可执行文件hello依赖于hello.o 是由gcc -o hello hello.o生成的
而hello.o依赖于hello.c 是由gcc -c -o hello.o hello.c生成的
当hello.c被重新修改过,执行命令时make时,hello.c就被重新编译,重新生成hello.o hello.o又比hello新,所以hello也需要重新生成。
.PHONY : clean表示clean是一个“伪目标”,伪目标的命令是rm hello.o hello 删除生成的文件,一般不将伪目标放到makefile的文件头部,这样会变成make的默认目标,当执行伪目标的时候,应该是:make clean
当输入make命令按下回车,make命令就会在当前目录寻找makefile 或 Makefile文件。
如果找到,就将第一个目标文件作为最终文件。然后寻找目标文件,若目标文件不存在或他的依赖比目标文件新,那么就会执行后面的命令。如果 edit 所依赖的.o文件也存在,那么 make 会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。
最后生成可执行文件。
未完......