关于动态链接与静态链接

原创 2012年03月22日 14:48:31

大家都知道应用程序有两种链接方式,一种是静态链接,一种是动态链接,这两种链接方式各有好处。

程序的静态连接还是动态连接是根据编译器的连接参数指定的。

所谓静态链接就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些。(所谓库就是一些功能代码经过编译连接后的可执行形式。)

所谓动态链接就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能。


上面的都是一些概念性的,也是比较简单的,可能大家都知道,但是具体的实现方式是什么样的那?比如两个最主流的操作系统windows和linux是怎么实现的。

windows:

在windows上大家都是DLL是动态链接库,里面是一系列可执行的代码,开发过windows程序的人可能还知道有另外一种形式的库,就是LIB,大家可能普遍认为LIB就是静态库,至少我之前是这么认为的,但是在实际的开发过程中,纠正了我这个错误的想法。LIB形式的文件可能会有两种形式,这里并不排除第三种形式。1:包括符号表和二进制可执行代码,也就是传统意义上理解的静态库,可以被静态连接。2:只有符号表,也就是只有动态库的符号导出信息,通过这些信息可以在程序运行时定位到动态库中,最终实现动态连接。

linux:

在linux上大家也都知道SO是动态库,类似于windows下的DLL,实现方式也是大同小异,同时开发过linux下程序的人也都知道另外一种形式的库就是A库,同样道理普遍认为是和SO对立的,也就是静态库,不然没道理存在啊,呵呵。但是事实区却不是如此,A文件的作用和windows下的LIB文件作用几乎一样,也可能会有两种形式,和windows下的lib文件一样,在此就不在赘述。


对于两个平台下我认为是静态库的竟然还有第二种情况(就是LIB和A不只是静态库)是我万万没有想到的,对此我感到非常诧异,可能大家都意识到了(只有我没意识到),再此对自己批评一番!


经过这样一说可能大家都会明白了(也许你已经明白),在以后的开发中可能也都会用心一点,其实很多东西都不是我们表面上看来的那么简单,上面的理解和解释不一定全对,但是确实我在实际开发中所发现的,大家仅仅作为参考就行。在此我也告诫自己,凡事不能想当然,不能以自己所知道和理解的那一点做为正确答案,要善于学习,善于向比自己强的人学习,要勇敢的面对自己的错误!



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

动态链接的一点小总结 《程序员的自我修养》·笔记

动态链接的一点小总结 动态链接(相对于静态链接)的优势动态链接可以节省内存和磁盘空间。动态链接使得内存和磁盘中的编译完成的目标文件只保留一份,这样也可以减少物理页的换入换出,同时也可以增加CPU缓存的...

动态链接原理分析

linux 下动态链接实现原理 符号重定位 讲动态链接之前,得先说说符号重定位。 c/c++ 程序的编译是以文件为单位进行的,因此每个 c/cpp 文件也叫作一个编译单元(translation u...

动态链接及其部分实现细节

一、动态链接的好处前面说了静态链接的流程,提到了静态链接与动态链接的不同之处以及各自的优势:静态链接的优势在于其优秀的可移植性,但是相对应的其所占空间大小也很大,且还有在对程序的更新、维护方面也有着问...
  • taocr
  • taocr
  • 2016年09月04日 17:46
  • 1116

静态和动态链接

引言 即使是最简单的HelloWorld的程序,它也要依赖于别人已经写好的成熟的软件库,这就是引出了一个问题,我们写的代码怎么和别人写的库集成在一起,也就是链接所要解决的问题。 ...
  • jewes
  • jewes
  • 2013年04月07日 00:50
  • 11137

动态装入(Dynamic loading) 和动态链接 (dynamic linking)的区别是什么?

首先,原文地址如下: http://www.quora.com/Systems-Programming/What-is-the-exact-difference-between-Dynamic-lo...

静态链接与动态链接的区别

我们大家在编程过程中对“链接”这个词并不陌生,链接所解决的问题即是将我们自己写的代码和别人写的库集成在一起。链接可以分为静态链接与动态链接,下文将分别讲解这两种方式的特点与其区别。 静态链接 ...

静态链接库与动态链接库----C/C++

静态链接库和动态链接库

理解静态链接与动态链接

转自:http://burningcodes.net/%E7%90%86%E8%A7%A3%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E4%B8%8E%E5%8A%A8%...
  • earbao
  • earbao
  • 2016年12月29日 22:34
  • 241

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

静态链接把要调用的库函数直接链接到目标程序。成为可执行文件的一部分。换句话说,要调用的库函数在程序的exe文件中,该文件包含了运行时所需的全部代码。静态链接的缺点是当多个程序都调用相同的函数时,内存中...

动态库静态库链接运行测试

  • 2017年07月02日 22:19
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于动态链接与静态链接
举报原因:
原因补充:

(最多只允许输入30个字)