编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你 需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在 C/C++ 文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个 源文件都应该对应于一个中间目标文件( O 文件或是 OBJ 文件)。
链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件( O 文 件或是 OBJ 文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函 数的中间目标文件( ObjectFile ),在大多数时候,由于源文件太多,编译生成的中间 目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便, 所以,我们要给中间目标文件打个包,在 Windows 下这种包叫 “ 库文件 ” ( Library File) ,也就是 .lib 文件,在 UNIX 下,是 Archive File ,也就是 .a 文件。
总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译
时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成 ObjectFile 。而在链接程序时,链接器会在所有的 Object File 中找寻函数的实现,如果找不到,那到就会报链接错误码( Linker Error ),在 VC 下,这种错误一般是: Link2001 错误,意思说是说,链接器未能找到函数的实现。你 需要指定函数的 ObjectFile. 好,言归正传, GNU 的 make 有许多的内容,闲言少叙,还是让我们开始吧。
猜您喜欢
评论