静态库与动态库

我们通常把一些函数进行封装,制作成函数库,给出库文件和头文件,用户可以通过头文件中的声明进行函数调用,而不需要关心函数的具体实现过程。函数库分为静态库和动态库。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。下面对静态库和动态库的制作过程、使用过程、优点和缺点进行总结。

一、文件说明

首先创建 main.c 、add.c、sub.c、calc.h,addc.c和sub.c分别定义了加法和减法的函数,calc.h中对addc.c和sub.c中的减法和减法函数进行声明,实现main.c包含calc.h来调用减法和减法函数。静态库后缀为.a,动态库后缀为.so

  • 创建文件

  • add.c

  • sub.c

  • calc.h

  • main.c

二、静态库

  • 制作过程

①将所有需要制作成库文件的.c文件编译成为.o文件,使用gcc编译 选型为-c,下图可知生成了add.o和sub.o

 

②将所有.o文件打包,使用ar命令,库名以lib开头,即lib+name,后缀为.a,下图可知生成了静态库文件libcalc.a

  • 使用

使用静态库进行编译时需要添加静态库路径、库名和头文件路径,头文件路径前加-I(大写),静态库路径前加-L,静态库前加-l(小写),如下所示,生成了main可执行文件。

  • 运行

  • 优点

  1. 执行快
  2. 发布应用时不需要发布库
  • 缺点

  1. 执行程序会比较大
  2. 库变更时需要重新编译应用

 

三、动态库

  • 制作过程

①编译与位置无关的代码,生成.o关键参数为 -fPIC,如下所示,生成add.o和sub.o文件。

 

②将.o文件打包,关键参数-shared,如下所示,生成libcalc.so动态库文件

  • 使用

使用动态库是通过-L指定库路径 -l指定库名,-I指定.h文件路径

  • 运行

运行时出现了加载动态库失败的问题。

    解决上诉问题有三种办法:

  1. 将动态库拷贝到  /lib 下
  2. 将库路径添加到环境变量LD_LIBRARY_PATH中 (export LD_LIBRARY_PATH 动态库路径:$LDLD_LIBRARY_PATH)
  3. 配置/etc/ld.so.conf文件,增加 动态库路径,然后执行sudo ldconfig -v
  • 优点

  1. 执行时需要加载动态库,相对而言,比静态库慢
  2. 发布应用时需要同时发布动态库
  • 缺点

  1. 执行程序小
  2. 库变更时,一般不需要重新编译应用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值