静态库和动态库

一,静态库

1,命名格式

  • lib+库名+.a
  • libtest.a test为库名

2,描述

优点:

  • 寻址方便,速度快
  • 库被打包到可执行程序中,直接发布可执行程序即可使用

缺点:

  • 静态库的代码在编译过程中已经被载入可执行程序中,因此体积较大
  • 如果静态库改变,那么要重新编译

使用场合

  • 在核心程序上使用,保证速度,可忽视空间
  • 主流应用于80,90年代,现在很少用

3,制作静态库

  • 得到*.o :gcc -c a.c b.c c.c
  • 得到静态库:ar rcs libtest.a a.o b.o c.o

  •     ar工具不包含在gcc中
  •     r:将文件插入静态库
  •     c:创建静态库,不管库是否存在
  •     s:写入一个目标文件索引到库,或者更新一个存在的目标文件索引
  • nm libtest.a:查看库中的符号

4,使用静态库

  • 格式:gcc +源文件+ -L静态库路径+ -l静态库名+ -l头文件目录+ -o可执行文件名
  • 静态库名不包括lib .a
  • 生成的静态库需要跟对应头文件同时发布

二,动态库(共享库)

1,命名格式

  • lib+动态库名+.so
  • libtest.so

2,描述

机制:共享库代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小

优点:节省内存,易于更新

缺点:延时绑定,速度略慢

使用场合:对于速度要求不是很强烈的地方都应使用动态库

注意事项:动态库是否加载到内存,取决于程序是否运行

3,制作

生成与“位置无关”的目标文件。gcc -fPIC a.c b.c c.c -c

gcc -shared -o libtest.so a.o b.o c.o

4,使用动态库

格式:gcc +源文件+ -L静态库路径+ -l静态库名+ -l头文件目录+ -o可执行文件

5,运行可执行文件

发现会运行失败。查看依赖共享库:ldd app 发现libtest.so找不到

原因:没有给动态连接器指定好动态库libtest.so路径

解决方法:

  • 临时设置:export LD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效了。
  • 永久设置:将上面语句写入家目录下的.bashrc文件中
  • 粗暴设置:直接将libmytest.so文件拷贝到/usr/lib/【/lib】目录下。(受libc库的启发)
  • 将libmytest.so所在绝对路径追加入到/etc/ld.so.conf文件,使用sudo ldconfig -v 更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值