Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59372
  • 博文数量: 10
  • 博客积分: 214
  • 博客等级: 入伍新兵
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-19 19:09
文章分类

全部博文(10)

文章存档

2012年(10)

我的朋友

分类: Python/Ruby

2012-10-22 21:39:56

编译:一般来说CC++首先要把源文件编译成中间代码文件,在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所需要的文件或是目标,也称为依赖。若是多个也是用空格分开。若依赖过长,还可以使用“\”换行。

commandmake需要执行的命令(任意的shell)。若命令不在“targets : prerequisites”则需加上table键而不是空格,若是在同一行需用分号分隔。

 

Makefile的规则:

targets这一个(或多个)目标文件依赖于prerequisites(一个或多个)中的文件,其生成规则在command中。prerequisites 中如果有一个以上的文件比target 文件要新的话(被修改的时间比targets新,targets需要重新生成),command所定义的命令就会被执行。

 

 

一个最简单的makefile

 

//filehello.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文件。

最后生成可执行文件。

未完......

阅读(1449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~