【动态库的制作和使用_Linux】
01 / 动态库的制作02 / 工作原理找不到连接的动态库解决方法:1. 在linux下最方便的解决方案是拷贝`libcalc.so`到绝对目录 /lib 下(但是,要是超级用户才可以,因此要使用sudo~)。就可以生成可执行程序了2. 将动态库文件的路径指定到LD_LIBRARY_PATH中,如export LD_LIBRARY_PATH=./lib[临时方案,关闭终端失效]3. 修改配置文件,
- 01 / 动态库的制作
- 02 / 工作原理
- 找不到连接的动态库解决方法:
- 1. 在linux下最方便的解决方案是拷贝`libcalc.so`到绝对目录 /lib 下(但是,要是超级用户才可以,因此要使用sudo~)。就可以生成可执行程序了
- 2. 将动态库文件的路径指定到LD_LIBRARY_PATH中,如export LD_LIBRARY_PATH=./lib[临时方案,关闭终端失效]
- 3. 修改配置文件,添加`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wf/Linux_text/lesson06/library/lib` 到`~/.bashrc`最后,每次终端开启都会读该配置文件(用户级配置)
- 4.添加`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wf/Linux_text/lesson06/library/lib` 到 `/etc/profile` 每次终端开启都会读该配置文件(系统级配置)
- 5. 配置 /etc/ld.so.cache文件列表(间接修改)
- 03 / 动态库的优缺点
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下动态库的制作和使用
更多推荐
所有评论(0)