我们都知道,编译器生成的目标文件中(如C编译后生成的.o文件)中会有一堆符号(symbol)。
有的符号可能并没有在本文件中定义,而是定义在其他目标文件中。
为了能使程序跑起来,
你需要把本目标文件和其他目标文件链接(link)起来,解析相关的符号(resolve the symbols),并合并生成一个可执行的文件。
这就是“链接”的定义。
在程序运行前执行链接,叫做“静态链接” (dynamic linking);它生成的可执行文件来自多个目标文件,所以可能会比较大。
而在程序运行的时候才临时找到相关目标文件并resolve symbols, 则属于“动态链接”(dynamic linking).
动态链接的一个典型例子是:只把自己写的代码直接编译成可执行文件,以免文件太大;在运行时才临时链接到库文件。Windows的DLL就是这样搞的。