当前位置:   article > 正文

动态库和静态库的区别

动态库和静态库的区别

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

静态库的生成:

ar -rc
  • 1

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

gcc -c print.c -o print.o

ar -rc libtest.a print.o

gcc main.c -L . -ltest -o main
  • 1
  • 2
  • 3
  • 4
  • 5

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

lib
  • 1

后缀

.so
  • 1

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

ldd + 可执行程序
  • 1

在这里插入图片描述

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

libhello.so  
  • 1

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

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

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

动态库的生成与使用

动态库生成:

gcc / g++ 

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

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

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

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

#include<stdio.h>

int main()
{
  print();
  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

gcc main.c -L . -ltest

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

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

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

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

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

  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
  • 1
  • 2

在这里插入图片描述

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/232214?site
推荐阅读
相关标签
  

闽ICP备14008679号