动态库和静态库的区别

静态库:
在程序编译时会被链接到代码中,程序运行时将不再需要静态库。
后缀是lib

静态库的生成:

ar -rc

在这里插入图片描述
生成静态库的时候要使用.o文件来进行编译生成

gcc -c print.c -o print.o

ar -rc libtest.a print.o

gcc main.c -L . -ltest -o main

动态库:
在程序编译并不会链接到代码中,而是在程序运行时被载入,动态库又被称为动态链接库,英文简称DLL,DLL是包含可以由多个程序使用的代码和数据的库,DLL是不可执行文件。
前缀

lib

后缀

.so

如何查看一个可执行文件所依赖的库?

ldd + 可执行程序

在这里插入图片描述

在linux操作系统下 静态库 linux后缀为.a文件
动态库 linux为.so文件

libhello.so  

使用这个动态库,我们直接在makefile文件中 -hello就行.

LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。并不是在编译阶段就起效果

ldd命令:
ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。

动态库的生成与使用

动态库生成:

gcc / g++ 

-shared : 产生共享库的命令行参数
-fPIC:产生位置无关的代码

我们来制作个动态库
先写个test.c

#include<stdio.h>
int print()
{
  printf("我是动态库\n");
}
gcc -shared -fPIC test.c -o libtest.so

我们写个测试的代码 main.c

#include<stdio.h>

int main()
{
  print();
  return 0;
}

此时文件信息
在这里插入图片描述

如何让主函数使用这个libtest.so

gcc main.c -L . -ltest

-L 指定链接的库文件路径
-l 链接的库文件路径 (去掉了前后缀)

这样就能找到这个动态库进行链接
在这里插入图片描述

**问题:**不论将程序依赖的动态库放到哪里程序都能找到自己依赖的动态库
1:将动态库放到可执行程序的目录下
可执行程序会搜索当前目录
2:环境变量

LD_LIBRARY_PATH : 保存动态库的搜索路径

我们来看这个路径下有什么
在这里插入图片描述
总结:

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
/home/flf/second_stage_review/D_S_Library

在这里插入图片描述

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
在这里插入图片描述
解耦:互相的影响不是很大

静态链接:在生成可执行程序的时候,加上-static,将库文件内容编译到可执行程序中
静态库和静态链接有什么关系?
没关系。

动态库不止能动态链接,也可以在编译程序的时候静态链接,同理,静态库不仅仅能静态链接,也可以在编译程序的时候动态链接,生成一个动态链接的可执行程序。

动态库优点:
模块体积几乎不变,当多个模块使用该库时,内存中只存在一份代码。
缺点:代码在单独文件中有零散文件
静态库优点:
代码合并到模块中,无零散文件。
静态库缺点:
模块体积变大,多个模块使用库,内存中存在多份代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值