什么是动态链接库和静态链接库?它们有什么区别?它们分别如何使用?
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
静态库和动态库的区别
涉及一些编译原理了
编译器将源代码编译成“目标文件”*.obj,其实,目标文件已经编译成二进制机器码了,目标文件可以直接打包成lib静态库,用微软的C/C++编译器里的lib.exe即可,编译器会把函数定义编译成强符号,把函数声明编译成弱符号,一般,lib的源码里有很多函数定义,他们被编译成强符号并导出来了,我们头文件里的函数声明,则被编译成弱符号,在程序编译时,连接器负责将弱符号对接到强符号上,如果调用的弱符号没有对应的强符号,那么会出现“无法解析的外部符号”连接错误。
动态库的源码也是函数定义,函数符号也被导出,不过他是动态调用的,调用方法有两种:1。在源程序编译时PE文件结构里有一张导入表,导入表里有要导入的动态连接库,程序运行时,PE装载器将PE文件装载到虚拟内存,再根据导入表装载动态连接库,根据情况重定向,再构建函数导入地址表(IAT),应用程序根据这个表调用动态连接库里的函数。2。动态调用,程序运行时,通过LoadLibrary和GetProcAddress这两个函数动态装载动态连接库,找到函数地址,call函数。
其实机器人有时候回答的也是很好的。参考http://blog.csdn.net/jeffreyst_zb/article/details/7045344
静态库编译到你的文件中,属于代码重用,发布的时候不需要其它处理,直接带上编译的程序就可以。但是一旦静态库代码改变,就需要重新编译所有相关代码。
动态库只灰编译一个stub到程序,你的程序发布时,需要带上动态库文件。动态库代码改变,只需要编译动态库,然后更新动态库文件,其它文件不需要改变,动态库是插件开发模式。