动态库的制作
命名规则
Linux : libxxx.solib :前缀(固定)
xxx: 库的名字,自己起
.so后缀(固定)
在Linux下是一个可执行文件
windows : libxxx.dl1
动态库(共享库)制作
gcc 得到.o 文件、得到和位置无关的代码
gcc -c -fpic/-FPIC a.c b.c
gcc得到动态库
gcc -shared a.o b.o -o libcalc.so
工作原理
静态库: GCC进行链接时,会把静态库i代码打包到可执行程序中。
动态库: GCC进行链接时,动态库的代码不会被打包到可执行程序中。
程序启动之后,动态库会被动态加载到内存中,通过ldd (list dynamicdependencies)命令检查动态库依赖关系。
如何定位共享库文件呢?
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段—>环境变量LD_LIBRARY_PATH —> /etc/ld.so.cache文件列表—>/lib/,/usr/lib目录找到库文件后将其载入内存。
添加环境变量
error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
添加环境变量解决上面的问题
临时配置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/carey/Linux/lesson4/library/lib
# /home/carey/Linux/lesson4/library/lib为动态库所在绝对路径
# 这是在终端配置 是临时的
用户级别配置
进入home目录
cd /home/carey
编辑 .bashrc
vim .bashrc
在末尾添加
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/carey/Linux/lesson4/library/lib
应用即可
. .bashrc
# 或者
source .bashrc
系统级别配置
vi /etc/profile
# 行末添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/carey/Linux/lesson4/library/lib
# 应用即可
source /etc/profile
# or
. /etc/profile
添加环境列表
vim /etc/ld.so.conf
# 添加动态库路径保存应用即可
# 添加动态库绝对路径: /home/carey/Linux/lesson4/library/lib
# 应用:
sudo ldconfig
直接将动态库放到 /lib or /usr/lib (不推荐)
总结
# 生成与位置无关的.o文件
root@ubuntu:/home/carey/Linux/lesson4/library/src# gcc -c -fpic add.c div.c mult.c sub.c -I ../include/
root@ubuntu:/home/carey/Linux/lesson4/library/src# ls
add.c add.o div.c div.o mult.c mult.o sub.c sub.o
# 生成 动态库
root@ubuntu:/home/carey/Linux/lesson4/library/src# gcc -shared add.o div.o mult.o sub.o -o libcalc1.so
root@ubuntu:/home/carey/Linux/lesson4/library/src# ls
add.c add.o div.c div.o libcalc1.so mult.c mult.o sub.c sub.o
# 移到lib目录下
root@ubuntu:/home/carey/Linux/lesson4/library/src# mv libcalc1.so ../lib/
# 在main.c下运行
root@ubuntu:/home/carey/Linux/lesson4/library# ls
app_d include lib main1 main.c src
root@ubuntu:/home/carey/Linux/lesson4/library# gcc main.c -o main1 -I ./include/ -L ./lib -l calc1
root@ubuntu:/home/carey/Linux/lesson4/library# ls
app_d include lib main1 main.c src
# 执行main1
root@ubuntu:/home/carey/Linux/lesson4/library# ./main1
./main1: error while loading shared libraries: libcalc1.so: cannot open shared object file: No such file or directory
# 添加临时环境变量 执行
root@ubuntu:/home/carey/Linux/lesson4/library# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/carey/Linux/lesson4/library/lib
root@ubuntu:/home/carey/Linux/lesson4/library# ./main1
20 + 12 = 32
20 - 12 = 8
20 * 12 = 240