编译:编译器对源代码进行编译,是将以文本形式存在的源代码翻译为机器语言形式的目标文件的过程。
编译单元:对于C++来说每一个cpp文件就是一个编译单元。各个编译单元之间是互相不可知的。
编译器就是把我们写的源文件翻译成机器代码,连接器以编译器的输出作为输入,生成可执行文件。
因为编译器的编译单元只是单独的每个CPP,所以有些跨文件的东西它没法处理,比如声明为extern 的变量(当你需要在一个c++语言文件中使用另外一个c++语言文件中定义的变量时就需要加上extern来声明,这样编译器就知道这个变量是在别的文件中定义的)就需要用连接器来解决。
编译器把一个cpp编译为目标文件的时候,除了要在目标文件里写入cpp里包含的数据和代码,还要至少提供3个表:未解决符号表、导出符号表和地址重定向表。未解决符号表提供了所有在该编译单元里引用但是定义并不在本编译单元里的符号及其出现的地址。导出符号表提供了本编译单元具有定义并且愿意提供给其他编译单元使用的符号及其地址。地址重定向表提供了本编译单元所有对自身地址的引用的记录。