制作动态库
生成与位置无关的代码
gcc -c -fpic add.c div.c mult.c sub.c
得到动态库
gcc -shared add.o div.o mult.o sub.o -o libcalc.so
使用动态库
项目目录
把so文件拷贝到lib目录下
编译报错
gcc main.c -o main -I include/ -L lib/ -l libcalc.so
-I 头文件路径
-L动态库路径
-l(小L)动态库的名称
找不到共享库的位置
动态库原理
编译时不会报错,运行时报错。
运行时需要把动态库加载到内存中
当我们的程序使用动态库的一个API的时候,就会查找动态库的绝对路径,然后加载到内存当中。
ldd工具查看动态库位置
【方案1】解决动态库加载失败问题:添加LD_LIBRARY_PATH
1、临时添加动态库路径
添加动态库的绝对路径到环境变量
2、永远添加动态库路径
用户级别
打开系统的环境变量
vim .bashrc
添加so的绝对路径
使配置文件生效
. .bashrc 或 source .bashrc
系统级别
打开配置文件
sudo vim /etc/profile
添加动态库的绝对路径
使之生效
source /etc/profile
至此,配置好啦
【方案2】解决动态库加载失败问题:添加ld.so.cache
先删除/etc/profile
的so的绝对路径
然后,刷新一下
. /etc/profile
接下来,开始配置:
- 打开ld.so.catch,注意直接用vim无效,需要使用
sudo vim /etc/ld.so.conf
- 使用
sudo ldconfig
使之生效
这个就是打开/etc/ld.so.conf之后的效果,将so的绝对路径添加进去
检查一下是否成功添加,也可以成功运行
【方案3】解决动态库加载失败问题:添加lib,/usr/lib【不推荐使用】
lib,/usr/lib包含了系统自带的动态库文件,如果重名了的话会被替换,系统程序可能出问题