静态链接和动态链接

来源:互联网 发布:云南地税网络申报平台 编辑:程序博客网 时间:2024/05/22 01:31

一.静态链接

    静态链接是在链接阶段,将静态链接库中的目标文件直接拷贝到最终的程序中,链接完成后,整个程序最终只有一个可执行文件,它是一个不可分割的整体。在链接阶段,就完成了对于符号的重定位。静态链接可以将程序需要的依赖降低,但是,这会造成空间浪费,以及对程序的更新、部署和发布的麻烦。

二.动态链接

   动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完成的程序,而不是像静态链接一样把所有的程序模块都链接成一个单独的可执行文件。动态链接的一个特点就是将链接的过程延迟到程序要执行之前才进行。由于动态链接将程序按照模型进行拆分,因此,不同的程序之间可以共享一些模块,这样就可以减少这些程序载入内存时的空间消耗,同时,对于一些模块的更新也可以通过替换该模块的形式进行,只需要更新一些dll文件,而不是像静态链接那样需要重新更新整个程序。


三.静态链接和动态链接的区别

1.静态链接得到的可执行文件占用的空间较大,而动态链接生成的可执行文件较小;
2.静态链接得到的可执行文件在执行时速度较快;
3.动态链接能够方便地进行程序更新、部署和发布;
4.动态链接的方式使得开发过程中各个模块之间更加独立,耦合度更小,便于不同的开发者和开发组织之间独立进行开发和测试。
5.动态链接可以使得程序在运行时动态地选择加载各种程序模块,可以用来做程序的插件。




四.显式运行时链接

    支持动态链接的系统都支持一种更加灵活的模块加载方式,叫做显式运行时链接(Explict Run-time Linking),有时候也叫做运行时加载。也就是让程序自己在运行时控制加载指定的模块,并且可以在不需要该模块的时候将其卸载。 
    在linux中,提供四个函数来对动态库进行操作:打开动态库(dlopen)、查找符号(dlsym)、错误处理(dlerror)以及关闭动态库(dlclose)。
    在windows中,提供下面三个函数来对DLL进行操作:LoadLibrary(装载一个DLL到进程的地址空间),GetProcAddress(用来查找某个符号的地址),FreeLibrary(用来卸载某个已加载的模块)。
    利用上面的函数,可以在程序中显性的加载动态库,使用这种方法,可以实现程序插件的功能。




版权所有,欢迎转载,转载请注明出处,谢谢微笑
0 3
原创粉丝点击