一个庞大、完整的C语言程序(Linux内核、uboot)是由多个c文件和多个h文件组成。而c文件中主要存放的是程序的函数、代码,h文件则是头文件、宏定义、结构体定义、函数声明等。要执行这样庞大的c语言程序,就需要了解C语言的链接属性。
程序的生成过程
程序的生成过程是:编译加链接。我们的多个c文件和h文件变成我们的可执行程序,必须要经过编译和链接两个过程。编译的过程是为了将我们的函数/变量编程一个.o的二进制格式机器码,链接时为了将各个独立分开的二进制的函数链接起来形成一个整体的二进制可执行程序。
编译时是以文件为单位的,而链接是以工程为单位的
编译器工作时是将所有源文件依次读进来,单个为单位进行编译的(再编译a.c时不会去考虑b.c,编译器再工作时只考虑一个文件,将这个编译完成后再去编译下一个)。所以如果再a.c中要引用b.c中的函数要先进行函数声明,如果没有声明,编译器在编译a.c时会直接报错。
链接时就是将之前编译生成的一个个的.o文件,链接成一个可执行程序。在编译时一个.c文件编译成一个.o文件,而链接就是将一个个的.o文件链接成一个可执行程序。
链接的三种属性:外连接、内连接、无连接
链接的实质:在链接时主要就是要去找符号(全局变量和函数),看谁引用了谁,将引用的符号和定义的符号联系起来。比如在a.c引用了一个函数,那么就需要去找在哪里定义了这个函数,将二者联系起来。
在链接时主要需要处理:在a.c中引用了b.c当中的函数。