动态库和静态库的区别

   区别1:在目标文件链接成可执行文件阶段,库函数(库函数本身有一个代码段)链接进可执行文件(代码段)中,占了很大的内存空间。而使用动态库时,只是在链接时做了一个printf的标记,当可执行程序运行时才会加载这段printf(从库路径中加载动态链接库.so文件),这样就节省了可执行程序的空间,只有在运行这段很短的时间会占用可执行程序的空间。
可以做个测试,写一个输出hello world的小程序,一般是Linux下gcc中是默认是使用动态库的,可以看到可执行程序a.out的大小只有7千多k,而使用静态库,链接后生成可执行程序时把printf也链接到了可执行程序中,这时候可执行程序就有700多K了。
      区别2:使用动态库对库的依赖性太强,一般发布的话需要库文件(库文件要放在相应的库路径中)也发布。、
静态链接库对库的依赖性不会有那么强。静态库就像房车,出门旅游不用依赖住房,但是房车占空间;动态库就像小车,出门旅游依赖要住酒店,但是小车省空间。

     实际上使用动态库在运行的时候加载printf也会占用可执行程序,在运行时占用可执行程序的空间其实是跟静态库是一样的。
但是试想:一个可执行程序a.out中有多个文件(如a应用程序,b应用程序,c文件程序),a,b,c都需要调用printf。
使用静态库时,链接时就链接了三份printf,运行时就加载三份printf,产生多分副本,白白浪费内存。而使用动态库时,链接时,只是将printf的标记链接进了可执行程序a,out,运行时printf只用加载一份,a调用时就是调用这一份printf,b调用时也是调用这一份printf。-------这才是动态库相对于静态库真正的优势!


    总结:静态库:1.链接时将程序放进进可执行程序
                             2.会产生多分副本
                             3.不依赖程序运行
               动态库:1.程序运行时,加载时才去动态库找函数
                             2.多进程共享
                              3.依赖程序运行

猜你喜欢

转载自blog.csdn.net/bhj1119/article/details/79937559