一、概述
二、动态库的优缺点
机制:
- 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
优点:
- 节省内存(共享)
- 易于更新(动态链接)
- 停止运行程序
- 使用新库覆盖旧库(保证新旧库名称一致,接口一致)
- 重新启动程序
缺点:
- 延时绑定,速度略慢
使用场合:
- 对速度要求不是很强烈的地方都应使用动态库
注意事项:
- 动态库是否加载到内存,取决于程序是否运行
命名格式:
- lib开头
- 动态库名
- .so结尾
三、动态库的制作
(1)制作步骤
1)生成“与位置无关“的目标文件。
gcc -fPlC a.c b.c c.c -c
- 参数:-PIC 表示生成与位置无关代码
- 执行完毕后生成一系列的 .o 文件
2)制作动态库
gcc -shared -o libmytest.so a.o b.o c.o
- 参数:-shared 制作动态库
- -o:重命名生成的新文件
3)使用动态库
gcc main.c -L ./ -Imytest -I / -o app
- -L–>指定库所在的路径
- 去掉前缀 lib
- 去掉后缀 .so
- 只留下中间部分
- -I–>头文件目录位置
/.app–>运行失败
- 查看依赖的共享库:ldd app 发现 libmytest 找不到
- 没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径
- 解决方案
- 临时设置:export LD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效
- 永久设置:将上条写入家目录下 .bashrc 文件中
- 粗暴设置:直接将 libmytest.so 文件拷贝到 /usr/lib/【/lib】目录下。(受 libc 库的启发)
- 将 libmytest.so 所在绝对路径追加入到 /etc/ld.so.con 文件,使用 sudo ldconfig-v 更新
(2)实际操作
- 生成 .o 目标文件,文件路径和内容同上,进入到 src 目录,生成 .o 目标文件:
- 将 .o 文件打包生成动态库
- 使用生成的动态库,-L 指定动态库路径 -l 指定库名
gcc main.c -o main -I include/ -L ./lib -lCalc
- 退出到 dongtai 目录下,将动态库拷贝到 lib 目录下并编译 main.c 并执行 main:
无法找到动态库目标文件,解决方法有三个:
(1)拷贝到 /lib 下(不允许,容易与别人库命名重合)
(2)将库路径增加到环境变量 LD_LIBRARY_PATH 中(不是特别推荐)
(3)配置 /etc/ld.so.conf 文件,增加 /home/linux/dongtai/lib/ 路径,执行 ldconfig -v,并执行 main