1.源文件
c
// ~/02_dynamic_Lib/hello.c
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
printf("%d+%d=%d\n",10,20,add(10,20));
printf("%d-%d=%d\n",10,20,sub(10,20));
printf("%d*%d=%d\n",10,20,mul(10,20));
return 0;
}
c
// ~/02_dynamic_Lib/src/add.c
int add(int a,int b)
{
return a+b;
}
c
// ~/02_dynamic_Lib/src/mul.c
int mul(int a,int b)
{
return a*b;
}
c
// ~/02_dynamic_Lib/src/sub.c
int sub(int a,int b)
{
return a-b;
}
2.制作动态库
2.1.生成二进制文件
bash
gcc -c -fPIC ./src/*.c
2.2.生成动态库文件
bash
gcc -shared ./*.o -o ./lib/libmymath.so
3.动态库的使用
3.1.编译可执行文件
bash
gcc hello.c -L ./lib -l mymath -o app
3.2.执行可执行文件
bash
(base) ysf@ysf-virtual-machine:~/c-study/02_dynamic_lib$ ./app
输出如下:
bash
./app: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory
3.3.使用ldd查看动态库依赖
bash
ldd app
输出如下:
bash
linux-vdso.so.1 (0x00007ffc63860000)
libmymath.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000750eb6a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000750eb6c62000)
可以发现,动态库没有被正确找到
4.配置动态库的4种方式
4.1.使用环境变量
bash
export LD_LIBRARY_PATH=/home/ysf/c-study/02_dynamic_lib/lib
4.2.使用环境变量配置文件~/.bashrc
bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ysf/c-study/02_dynamic_lib/lib
4.3.将动态库文件放到系统目录
可以放到下面的目录里面:
- /lib
- /usr/lib
4.4文件缓存(最佳)
- 修改/etc/ld.so.conf文件,在里面换行加上自己的库目录,如下:
bash
include /etc/ld.so.conf.d/*.conf
/home/ysf/c-study/02_dynamic_lib/lib
- 修改完成后执行如下命令,更新缓存ld.so.cache:
bash
sudo ldconfig -v
5.再次执行可执行文件
bash
./app
可以看到报错被解决