使用库文件的优点
- 项目代码更加简洁,没有过多的源文件需要管理
- 保护项目代码,以库的方式提供给使用者,使用者无法知道源代码
静态库
静态库的制作
- 对源文件编译得到
.o
文件(加参数 -c) ar
进行打包,生成.a
静态库文件
gcc *.c(源文件) -c
ar rcs libxxx.a *.o
- c 创建一个库--创建
- s 创建目标文件索引--编号索引
- r 库中插入模块
静态库的使用
gcc main.c -o app -L 库的路径(绝对或者相对都OK) -l库的名字(去头lib,去尾.a)
动态库
动态库的制作
- 编译生成
.o
文件,必须加参数-fpic
gcc
生成对应库,加参数-shared
gcc 源文件(*.c) -c -fpic
gcc -shared *.o -o libxxx.so
动态库的使用和静态库保持一致
找不见库.so的问题
第一种
- 使用环境变量
LD_LIBRARY_PATH
- 动态库的绝对路径添加到该环境变量中
-LD_LIBRARY_PATH= /usr/lib/xxxx
export LD_LIBRARY_PATH
- 直接在shell中设置–临时当前终端生效
- 写入配置文件
~/.bashrc
- 用户级别/etc/prefile
- 系统级别
第二种
- 给动态库设置软连接
/usr/xxx
- 将软连接放到
/usr/lib
/usr/lib64
/lib
/lib64
sudo ln -s /usr/xxx/xxx.so /usr/lib
第三种
- 刷新
/etc/ld.so.cache
vi /etc/ld.so.conf
sudo ldconfig -v
各自优缺点
| 静态库 | 动态库 |
---|
优点 | 静态库打包到程序中,加载快;发布程序无需提供库文件,移植方便 | 多个进程共享库文件;方便升级 |
缺点 | 库文件会被加载多次,占用资源;更新库文件需要重新编译 | 加载较慢;发布程序需要库文件的支持 |
![静态库](https://img-blog.csdnimg.cn/img_convert/044f4b53beb966d01d725b47c4c952b8.png)
![动态库](https://img-blog.csdnimg.cn/img_convert/adc10b6b3fa948a92b4675f8edc9c069.png)
参考视频
b站视频