动态库的制作 静态库和动态库对比

52 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

一.

1.动态库的制作

image.png

(1)在终端里添加环境变量(缺点是关闭终端后环境变量便消失)

image.png

gcc得到.o文件,得到与位置无关的代码

gcc -c -fpic add.c div.c mult.c sub.c

image.png

在终端添加环境变量

  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/yj/Linux/lession02/library/lib

gcc得到动态库

 gcc main.c -o main -I include/ -L lib/ -l calc
 
 

(2)用户级别添加环境变量(永久保存)

回到初始目录下

cd

image.png

vim .bashrc并且在最后一行添加

image.png

2.工作原理

◼ 静态库:GCC 进行链接时,会把静态库中代码打包到可执行程序中

◼ 动态库:GCC 进行链接时,动态库的代码不会被打包到可执行程序中

◼ 程序启动之后,动态库会被动态加载到内存中,通过 ldd (list dynamic dependencies)命令检查动态库依赖关系 

◼ 如何定位共享库文件呢? 当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。

此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是 由ld-linux.so来完成的,

它先后搜索elf文件的 DT_RPATH段 ——> 环境变量 LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib 目录

找到库文件后将其载入内存

二.

1.程序编译成可执行程序的过程

image.png

2.静态库制作过程

image.png

3.动态库制作过程

image.png

4.静态库的优缺点

image.png

5.动态库的优缺点

image.png