编译链接原理   C++

来源:互联网 发布:电视网络机顶盒什么牌子的好 编辑:程序博客网 时间:2024/06/05 12:39
编译时,产生目标问题.obj文件,将源代码翻译成机器语言。在此过程中,各个

编译单元式没有沟通的,他们是在链接阶段进行沟通。

在编译阶段如果一个文件中用到了另一个文件的变量,由于在编译阶段这两个文

件时没有沟通的,所以会出现找不到的问题。这个问题通过未解决符号表、导出

符号表、地址的重定向表   这三个表之间的协调可以解决。
三个表的定义:
未解决符号表:在本编译单元中使用,没有在本编译单元进行定义的符号(告诉链接器,我还需要什么)

导出符号表:在本编译单元进行定义,并且别的编译单元也可以使用的符号(告诉链接器说,我能提供一些什么)

地址重定向表:记录了本编译单元所有对自身地址的引用(告诉编译器,本单元的哪些需要重定向)

链接器:
         (1)确定obj文件在可执行文件中的位置
        (2)查看所有的地址重定向表,对相应的obj文件中的自引用地址进行重定向
        (3)遍历未解决符号表,然后去导出符号表中找到匹配的符号,最后,在未解决符号所在位置填入实际地址(注意,是实际地址,即要加上该编译单元在可执行文件中的起始地址)
         (4)生产可执行文件


关键字:
         extern:告诉编译器这个符号是别的编译单元定义,我只用想用一下,所以,请你把这个符号放到未解决符号表中,以便让链接器去别的编译单元查找这个符号。

         static:告诉编译器,这个符号不允许别的编译单元使用,所以请你不要把这个符号放到导出符号表中。

什么时候使用extern和static:

extern intparam是声明一个变量,并不是定义,这样说明这个变量在别的地方已经定义。用extern定义的变量或者函数,说明在编译阶段会被写入到到未解决符号表,然后到导出符号表里面去找。
static 静态变量仅供本单元使用  由它定义的函数或者变量是不会被写入到导出符号表中的。
include文件的时候使用<>和""的区别,如果使用""则优先到当前目录下查找该文件,如果使用<>,则优先到系统目录中查找文件。速度上会有一些差别。
0 0