C代码编译生成可执行程序会经过如下过程:
![](https://i-blog.csdnimg.cn/blog_migrate/878faa516c3fcee4bd4c31aadd801630.png)
链接就是把目标文件与一些库文件生成可执行文件的一个过程。
1、什么是静态链接?
静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。
链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。
这里的库指的是静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
2、什么是动态链接?
动态链接(Dynamic Linking),把链接这个过程推迟到了运行时再进行,在可执行文件装载时或运行时,由操作系统的装载程序加载库。
这里的库指的是动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
值得一提的是,在Windows下的动态链接也可以用到.lib为后缀的文件,但这里的.lib文件叫做导入库,是由.dll文件生成的。
3、静态链接与动态链接的优缺点?
(1)静态链接的优缺点:
优点:
代码装载速度快,执行速度略比动态链接库快;
只需保证在开发者的计算机中有正确的.lib文件,在以二进制形式发布程序时不需考虑在用户的计算机上.lib文件是否存在及版本问题。
缺点:
使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费。
(2)动态链接的优缺点:
优点:
生成的可执行文件较静态链接生成的可执行文件小;
适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试;
不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
缺点:
使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息;
速度比静态链接慢;