上次没写链接,原以为会和其他部分一样只有几页,没想到这本书一大半都是在讲链接背后的原理。那么就慢慢看吧~
链接
链接(Linking),顾名思义,就是将文件相互连接起来。为什么要链接呢?在写代码时我们经常会引用到外部函数,打个比方,在c语言中要使用rand()函数,则要:
#include <stdio.h>
#include <stdlib.h>
int main(){
int a = rand();
printf("%d\n",a);
return 0;
}
对于这段代码,看起来我们引用了两个头文件,stdio.h和stdlib.h。此外在项目中,我们也往往会有很多文件,这些文件之间相互引用,那么在代码写完后,将程序转化为可执行文件时,机器就需要通过这些引用的内容来处理二进制文件最终的样子。
机器在执行一个函数时需要先找到函数对应的地址,然而,代码不是一成不变的,我们总是会添加或者删除一些内容,因此代码的汇编地址也是会发生变化的(所以需要编译的语言每次修改后都要重新编译),那么当机器将一个文件外部的函数写成汇编时,它是不知道这个函数的地址的,所以会先搁置这部分,等到链接阶段再处理。
//fun.py
def func(a:int):
a += 1
//main.py
import fun
if __name__ == "__main__":
num = 0
fun.func(num)
当所有文件都编译完后,它们被放到一块,进行链接。在这时链接器会挨个地查找外部引用函数的地址,然后将编译过程中搁置的内容补全。最终,所有用到了的内容会被打包到一起,输出为一个可执行文件,在这个文件中这些引用的函数等都会被具体地确定下来,因此程序执行时只需要找到固定的地址就行了。
后续还有很多和链接有关的内容,包括静态链接和动态链接等等,那么就下次一定吧~