2 qq 27015869 qq_27015869 于 2015.07.21 21:01 提问

静态库和动态库的区别以及使用

什么是动态链接库和静态链接库?它们有什么区别?它们分别如何使用?

4个回答

CSDNXIAOS
CSDNXIAOS   2015.07.21 21:11

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 
静态库和动态库的区别

  1. 静态函数库     这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的......
    答案就在这里:动态库和静态库的区别及使用
    ----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?
tongyi55555
tongyi55555   2015.07.21 21:28

其实机器人有时候回答的也是很好的。参考http://blog.csdn.net/jeffreyst_zb/article/details/7045344

oyljerry
oyljerry   Ds   Rxr 2015.07.21 21:30

静态库编译到你的文件中,属于代码重用,发布的时候不需要其它处理,直接带上编译的程序就可以。但是一旦静态库代码改变,就需要重新编译所有相关代码。

动态库只灰编译一个stub到程序,你的程序发布时,需要带上动态库文件。动态库代码改变,只需要编译动态库,然后更新动态库文件,其它文件不需要改变,动态库是插件开发模式。

zuishikonghuan
zuishikonghuan   2015.07.21 21:26

涉及一些编译原理了
编译器将源代码编译成“目标文件”*.obj,其实,目标文件已经编译成二进制机器码了,目标文件可以直接打包成lib静态库,用微软的C/C++编译器里的lib.exe即可,编译器会把函数定义编译成强符号,把函数声明编译成弱符号,一般,lib的源码里有很多函数定义,他们被编译成强符号并导出来了,我们头文件里的函数声明,则被编译成弱符号,在程序编译时,连接器负责将弱符号对接到强符号上,如果调用的弱符号没有对应的强符号,那么会出现“无法解析的外部符号”连接错误。
动态库的源码也是函数定义,函数符号也被导出,不过他是动态调用的,调用方法有两种:1。在源程序编译时PE文件结构里有一张导入表,导入表里有要导入的动态连接库,程序运行时,PE装载器将PE文件装载到虚拟内存,再根据导入表装载动态连接库,根据情况重定向,再构建函数导入地址表(IAT),应用程序根据这个表调用动态连接库里的函数。2。动态调用,程序运行时,通过LoadLibrary和GetProcAddress这两个函数动态装载动态连接库,找到函数地址,call函数。

Csdn user default icon
上传中...
上传图片
插入图片