在这里写一下关于编译和链接的个人心得。
COMPILE-->
XXX.CPP--->XXX.O 还必须提供三个表:未解决符号表,导出符号表,地址重定向表。
未解决符号表:是指该cpp文件需要的相关变量或者函数的定义。
导出符号表:是指该cpp文件可以提供的变量和函数有哪些(外部链接方式)。
地址重定向表:在进行外部链接之后,地址的重新地位。
LINK-->链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然后访问所有目标文件的地址重定向表,对其中记录的地址进行重定向(即加上该编译单元实际在可执行文件里的起始地址)。然后遍历所有目标文件的未解决符号表,并且在所有的导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上填写实际的地址(也要加上拥有该符号定义的编译单元实际在可执行文件里的起始地址)。最后把所有的目标文件的内容写在各自的位置上,再作一些别的工作,一个可执行文件就出炉了。
链接方式:
外部链接:是函数和变量的默认链接方式,就是cpp文件里的函数和变量编译之后,在导出符号表里是要包含这些信息的。
内部链接:如果static关键字位于全局函数或者变量的声明的前面,表明该编译单元不导出这个函数/变量的符号。因此无法在别的编译单元里使用。(内部链接)。如果是static局部变量,则该变量的存储方式和全局变量一样,但是仍然不导出符号。
注意:对于外部链接,必须保证在程序范围内其他编译单元不能出现重复的符号。内部链接,不能再其他编译单元内使用。[在这里,编译单元就默认为cpp文件]