动态库和静态库

动态库:

动态库又叫共享库

动态库是一种可执行文件,文件后缀为.DLL或是.SO动态库存放在系统某个特定的位置,所有的进程都是可以共享或者引用这一份代码的内容。

实际上,每个程序运行起来,在它的虚拟地址空间上栈的附近有一部分是分配给共享库的。

动态库的特点:
1.存放在系统特定位置,每个程序都可以引用,不论多少程序引用,内存中只会存在该动态库指令的一份拷贝,是代码共享的一种方式;
2.在程序运行的时候才会去引用库中的相关函数,并不把这些函数的指令包含进去;
3.你可以这样认为:动态库就像是一个“仓库”,里面包含函数、变量和类等,你可以直接拿来用,不需要将这些指令包含在自己的可执行程序中,需要什么拿什么,所有进程都可以共同使用。

动态库的优缺点:
优点:
1.里面包含了大量程序运行需要的函数等,不需要开发者重复的开发相同功能的代码,起到代码复用的作用;
2.由于是运行时才对 相应的函数指令进行引用,最终并不把指令包含着可执行文件中,使得最终生成的可执行文件会比较小;
3.如果需要更新程序,只需要运行时将动态库重新引用即可;
4.多个进程引用该动态库,只需将其将在到内存中即可,并且只加载依次,只存在该库的一份拷贝,节省内存。

缺点:
跨平台能力差,对动态库的依赖太大,不够灵活,不同平台对应的动态库有一定的差异,即有可能出现不适用等情况;

静态库:
实际上也是种代码复用的方式,和共享库不同的是,用户在包含静态库的时候,不论使用到几个函数、几个变量、或者几个类,它都会自动将静态库的全部内容包含到自己的代码中,和包含它的源文件一起进行编译,最终和其他的目标文件链接成可执行文件。后缀名以.a(linux)和.lib(windows)结尾

静态库的优缺点:
缺点:
1.如果多个程序包含了同一个静态库,那么内存中会有多份静态库的内存拷贝,占用内存较大;
2.如果一个程序只用到了静态库的一个函数或者一个变量,但它还需要将这个库所有其他的指令包含进来,最终使得可执行程序体积庞大;
3.后期更新会比较繁琐,代价较大。

优点:
移植性较好,如果到了即使没有该静态库的平台,依然可以运行,因为已经完全包含进去了

 

静态库和动态库的比较:

在这里插入图片描述

————————————————

gcc helloworld.cpp -lstdc++  或 g++ helloworld.cpp

动态库和静态库的编译实行 

# compile static library
gcc -c hello.c
ar cr libmyhello.a hello.o
gcc -o hello main.c -L. -lmyhello

# compile dynamic library
gcc -fPIC -c hello.c
gcc -shared -fPIC -o libmyhello.so hello.o
gcc -o hello main.c -L. -lmyhello
 

“-fPIC”

“-fPIC”命令行标记告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它连接到哪一段内存地址空间。这样编译出的hello.o可以被用于建立共享链接库。建立共享链接库只需要用GCC的”-shared”标记即可。

-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L.:表示要连接的库在当前目录中,否则GNU连接器会查找标准系统函数目录
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so或.a来确定库的名称

LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
-I/usr/openwin/include:指定头文件查找目录

 

 

 


————————————————
版权声明:本文为CSDN博主「Luke_wang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luke_wang/article/details/73017263

 

 

 


版权声明:本文为CSDN博主「KingOfMyHeart」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/KingOfMyHeart/article/details/89348550

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值