01 / 动态库的制作

◼ 命名规则:

◆ Linux : libxxx.so
lib : 前缀(固定)
xxx : 库的名字,自己起
.so : 后缀(固定)
在Linux下是一个可执行文件
◆ Windows : libxxx.dll

◼ 动态库的制作:

◆ gcc 得到 .o 文件,得到和位置无关的代码
	gcc -c –fpic/-fPIC a.c b.c
◆ gcc 得到动态库
	gcc -shared a.o b.o -o libcalc.so

示例:
1、创建一个模拟计算器的多文件程序(想要源码可以给我发私信~)
在这里插入图片描述
2、gcc 得到 .o 文件,得到和位置无关的代码

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

在这里插入图片描述
3、gcc 得到动态库

gcc -shared *.o -o libcalc.so

在这里插入图片描述

注意:绿色文件在Linux下是一个可执行文件

02 / 工作原理

◼ 静态库

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

◼ 动态库:

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

◼ 程序启动之后,动态库会被动态加载到内存中,通过 ldd (list dynamic dependencies)命令检查动态库依赖关系
在这里插入图片描述

◼ 如何定位共享库文件呢?

当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。
此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,
它先后搜索elf文件的 DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——>/etc/ld.so.cache文件列表 ——> /lib/,
/usr/lib目录找到库文件后将其载入内存。

找不到连接的动态库解决方法:
1. 在linux下最方便的解决方案是拷贝libcalc.so到绝对目录 /lib 下(但是,要是超级用户才可以,因此要使用sudo~)。就可以生成可执行程序了
2. 将动态库文件的路径指定到LD_LIBRARY_PATH中,如export LD_LIBRARY_PATH=./lib[临时方案,关闭终端失效]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wf/Linux_text/lesson06/library/lib

在这里插入图片描述
重新打开后环境依赖失效
在这里插入图片描述

注意:查看当前环境依赖

echo $LD_LIBRARY_PATH

在这里插入图片描述

3. 修改配置文件,添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wf/Linux_text/lesson06/library/lib~/.bashrc最后,每次终端开启都会读该配置文件(用户级配置)
vim .bashrc //进入配置
shift + G  o
//最后一行 ,向下插入

在这里插入图片描述
使修改生效

. .bashrc
或者
source .bashrc

此时就OK了~
在这里插入图片描述

4.添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wf/Linux_text/lesson06/library/lib/etc/profile 每次终端开启都会读该配置文件(系统级配置)
sudo vim /etc/profile
source /etc/profile

在这里插入图片描述
在这里插入图片描述

5. 配置 /etc/ld.so.cache文件列表(间接修改)

因为/etc/ld.so.cache文件是二进制的,不允许修改,所以才去间接方式/etc/ld.so.conf

sudo vim /etc/ld.so.conf

在这里插入图片描述

在这里插入图片描述

03 / 动态库的优缺点
优点1:执行程序体积小

优点2:动态库更新不需要重新编译程序(前提是接口没有变化)

缺点1:发布时需要把动态库文件提供给用户

缺点2:运行时加载,相对静态库来说加载速度较慢

其他:
查看系统环境依赖
在这里插入图片描述
部分参考:SuperYang_linux下动态库的制作和使用

Logo

更多推荐