笔记整理:关于C和C++的编译、连接过程
最近感觉C和C++的编译和连接过程有些难以理解。在此整理笔记,以理清思路。
每一个程序都是经过编译和连接后生成可执行文件的。编译过程由编译器实现。而连接过程由连接器实现。
编译
在编译过程中,每一个源文件都是一个编译单元。编译器会检查语法错误,并且检查函数和变量是否声明以及声明是否正确。编译后每一个源文件产生一个后缀名为.obj或者是.o的文件。它们是生成的可执行的机器代码(二进制文件)。其中Windows系统为.obj,Unix系统为.o。
若是源文件太多,为便于管理,会将生成的二进制文件打包,Windows生成.lib文件,Unix生成.a文件。
对于函数和变量的声明,程序员需要告诉编译器头文件在哪里。注意到编译器是以源文件作为内存单元的,那么头文件就显得相当重要。因为编译器得到的一切关于源文件的信息都来自于本文件,那么头文件就成了含有外部文件信息的通道。(头文件一般只有声明,定义放在.c或者.cpp文件中)若是函数没有声明,编译器只会产生一个警告,但是会通过编译,即生成相应的Object文件(即中间目标文件)。
连接
连接会把生成的中间目标文件连接起来,生成可执行文件。连接时主要连接函数和全局变量,连接器并不管函数所在源文件,只管函数的中间目标文件。如果在连接时找不到函数或变量,就会报错(如上面提到的没有声明的情况)。
而若是写一些比较大型的程序,函数很可能出现重名的情况。这时连接时会产生一些意想不到的情况。这也是C++中使用命名空间的原因。在今后的学习中,一定会对此有所了解。