动态库的制作

动态库的制作

命名规则

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



猜你喜欢

转载自blog.csdn.net/qq_44861043/article/details/121280383
今日推荐