静态链接是指把要调用的函数或者过程直接链接到可执行文件中,成为可执行文件的一部分。也就是函数和过程的代码就在程序的可执行文件中,可执行文件包含了运行时所需的全部代码。
动态链接是指所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息,往往是一些重定位信息。仅当应用程序被装入内存开始运行时,在操作系统的管理下,应用程序与相应的动态链接库(dynamic link library,dll)之间建立链接关系,当要执行所调用dll中的函数时,根据链接产生的重定位信息,操作系统才转去执行dll中相应的函数代码。
静态链接的优点是执行程序能够在其他同类操作系统的机器上直接运行。缺点是当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了内存资源。动态链接的执行程序则不能够在其他同类操作系统的机器上直接运行,除非把该exe文件所需的dll文件都一起拷贝过去,或者对方机器上也有所需的相同版本的dll文件,否则是不能保证正常运行的。
静态链接库就是使用的.lib文件,库中的代码最后需要链接到可执行文件中去,所以静态链接的可执行文件一般比较大一些。
动态链接库是一个包含可由多个程序同时使用的代码和数据的库。可执行程序(如.exe文件或.dll文件)在运行时加载动态链接库,即将程序所需的动态链接库映射到调用进程的地址空间。
静态链接库和动态链接库的相同点是它们都实现了代码的共享。不同点是静态链接库lib中的代码被包含在调用的exe文件中,该lib中不能再包含其他动态链接库或者静态链接库了。动态链接库dll可以被调用的exe动态地“引用”和“卸载”,该dll中可以包含其他动态链接库或者静态链接库。