1.涉及概念,动态链接库,静态链接库
1.1动态链接库
目标程序通常都不是独立个体,生成程序时都需要链接其他的库,要用到其他库的代码。对于多个程序同时运行而言,内存中就可能有同一个库的多个副本,占用了太多内存而干的活差不多。
为了优化内存运用效率,引入了动态链接库,或叫共享库。使用动态链接库时,内存中只需要一份该库文件。其他程序要使用该库文件时,只要链接过来就行了。由于动态库文件外置,链接到动态库的目标程序相对比较小,因为剥离了大量库代码,而只需要一些链接指针。
使用动态库,也意味着程序需要链接到如*.dll或*.so文件,得提前装好动态库文件,然后目标程序才能正常运行。
1.2静态链接库
静态库就是将链接库的代码和自己编写的代码都编译链接到一块,链接到静态库的程序通常比较大,但好处是运行时依赖的库文件很少,因为目标程序自己内部集成了很多库代码。
库文件后缀
Linux/Unix系统里静态库扩展名一般是.a,动态库扩展名一般是.so。Windows系统里VC编译器用的静态库扩展名一般是.lib动态库扩展名一般是.dll
Lib文件到底是什么?
所以很多人认为lib为静态库,dll为动态库,这里理解并不错,但不全面。lib其实分两种的
第一种,lib是完整的静态库,里面有函数代码本身,有编译时直接将代码加入程序当中,应用程序直接使用
第二种,lib是动态库的导出声明,只含头部信息。里面只有函数所在的DLL文件和文件中函数位置的入口,代码由运行时加载在进程空间的DLL提供。