静态库和动态库

静态库(.a):
程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库;
动态库(.so):
程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码;

·一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码;
·在可执行文件开始运行前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接;
·动态库可以在多个程序间共享,故动态链接使得可执行文件更小,节省了磁盘空间。

生成静态库的目的:
解决给客户一堆 .o 文件的问题。
以下是生成静态库要用到的测试文件:

   add.h

   #ifndef __ADD_H__
   #define __ADD_H__

   int add(int a,int b);

   #endif //__ADD_H__
   add.c

   #include "add.h"

   int add(int a,int b)
   {
       return a + b;
   }       
   sub.h

   #ifndef __SUB_H__
   #define __SUB_H__

   int sub(int a,int b);

   #endif // __SUB_H__
   sub.c

   #include "sub.h"

   int sub(int a,int b)
   {
       return a - b;
   }
   main.c

   #include <stdio.h>
   #include "add.h"
   #include "sub.h"

   int main()
   {
       int a = 10;
       int b = 20;
       printf("add(%d,%d)=%d\n",a,b,add(a,b));

       a = 100;
       b = 20;
       printf("sub(%d,%d)=%d\n",a,b,sub(a,b));

      return 0;
  }

将测试文件写完后 ,按照以下的步骤即可生成静态库:
这里写图片描述
接着,我们链接静态库,编译main.c,结果如下:
这里写图片描述

最后,我们保留生成的测试目标文件,删掉静态库,看程序是否可以运行:
这里写图片描述
结果证明:测试目标文件生成后,静态库删掉,程序照样可以运行。

生成动态库的目的:
解决同样的代码在物理内存上存储多份的问题。

生成动态库要用的测试文件同上;
按照以下步骤即可生成动态库:
这里写图片描述
fPIC:产生位置无关码;
shared:表示生产共享库格式
库名规则:libxxx.so
运行动态库:
<1>、拷贝.so文件 到系统的共享库路径下,一般为 /lib;
<2>、更改LD_LIBRARY_PATH;
完成以上两步后,链接动态库,编译main.c,结果如下:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值