静态库
lib a 需要配合头文件使用
静态链接库就是把文件中用到的函数代码直接连接进目标程序,
程序运行的时候不再需要其它的库文件
静态lib将导出声明和实现都放在lib中,编译后所有代码都嵌入到宿主程序
在链接阶段,静态库会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,一次对应的链接方式成为静态链接。
静态库与汇编生成的目标文件一起链接为可执行文件,所以静态库必定和.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj)的集合,即很多目标文件经过压缩打包后形成的一个文件。
静态库对函数库的链接是放在编译时期完成的
程序在运行时与函数库再无瓜葛 移植方便
因为所有相关的目标文件和牵扯到的函数库被链接合成一个可执行文件,所以浪费空间和资源
因为是再编译时期完成的,所以如果一个很小的改动,都将导致整个程序重新编译
静态链接库中不能再包含其他的动态链接库或者静态库,而动态链接库可以再包含其他的动态或静态链接库
动态库
so dll
当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了内存资源,so文件是共享库文件(动态链接)。
动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅再其中加入了所调用函数的描述信息。仅当应用程序被装入内存开始运行时,再操作系统的管理下,才在应用程序与相应的so文件之间建立链接关系。
动态链接库就是把调用的函数所在的文件模板和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从dll中寻找相应的函数代码,一次需要相应的dll文件的支持。
动态lib相当于一个h文件,是对实现部分(.dll)的导出部分的声明,编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持。
动态库再程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入,不同的应用程序如果调用相同的库,那么在内存中只需要又一份该共享库的实例,避免了空间浪费问题。动态库再程序运行时才被载入。
动态库把对一些库函数的链接载入推迟到程序运行的时期
可以实现进程之间的资源共享
将一些程序升级变得简单