linux静态库、动态库

   在linux下安装软件将是一件极为痛苦的工作------因为他会有那么多的依赖关系。linux的一个开发原则是功不可没的,这个原则就是尽量不重复别人已经做过的事,要充分利用别人的劳动成果。
   库,是一种封装机制,简单说把所有的源代码编译成目标代码后打成的包。
   根据链接时期的不同,库又有静态库和动态库之分。
静态库:(libxxx.a)
   静态库是在链接阶段被链接的,链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。
    问题:
   首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序静态链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。
   再者,人非圣贤,即使是精心调试的库,也难免会有错。一旦发现了库中有bug,挽救起来就比较麻烦了必须一一把链接该库的程序找出来,然后重新编译
动态库:(kibxxx.so)
   有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。
   因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。

是不是静态库就一无是处了呢?
   有句话么:存在即是合理,想象一下这样的情况:如果你用libpcap库编了一个程序,要给被人运行,而他的系统上没有装pcap库,该怎么解决呢?最简单的办法就是编译该程序时把所有要链接的库都链接它们的静态库,这样,就可以在别人的系统上直接运行该程序了。

  

创建文件hello.c
include<stdio.h>
void hello()
{
       printf("hello zlm !\n");
}
创建文件main.c
int main()
{
           hello();
           return 0
}
创建动态库实例
$ gcc -shared hello.c -o libhello.so
                                                    编译成动态库。可以看到当前目录下生成了一个libhello.so动态库文件。
$ gcc main.c -lhello -L .(因为连接器默认是链接动态库,
                                                    告诉链接器去找当前目录下hello这个动态库
$ export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATY
                                                     动态加载器可以找到库(将当前路径加入环境变量LD_LIBRAYR_PATH)中
$ ./a.out
  hello zlm !

创建静态库实例:
$ gcc -c hello.c
$ ar r libhello.a  hello.o    -------------------->r 表示将文件插入到静态库文件中这样就生成了libhello.a静态库了。
$ gcc main.c -lhello -L . -Bstartic

动态库与静态库搜索路径顺序:
动态库:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

实际上 读取/etc/ld.so.cache 从中进行搜索的,他是由 /sbin/ldconfig 命令将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache生成的文件。(避免了搜索路径查找库带来的效率低下)

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

静态库:

1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的



但是为什么我实验结果动态的 比 静态的还要大呢???????求解!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值