动态库的制作和使用

命名规则:

Linux:libxxx.so

lib:前缀

xxx:名称

.so:后缀

在linux下是一个可执行文件

windows:

libxxx.dll

制作过程:

1.gcc/g++ 获得.o文件  得到和位置无关的代码 例如

gcc -c -fpic/-fPIC mycode.c
-fpic/-fPIC 得到和位置无关

2.得到动态库

gcc -shared mycode.o -o mycode.so

-shared : 生成目标共享文件,通常在建立共享库时。

3.运行

gcc main.c -o main -I ./include -l calc -L ./lib

此时发现无法运行  提示无法找到动态库

./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory

这是因为静态库和动态库工作原理不同。静态库在程序链接阶段被复制到程序中;动态库在链接阶段没有被复制到程序中,而是在程序运行时由系统动态加载到内存中供程序调用。就是说在程序链接时动态库不会被打包到可执行程序中。只有程序调用了动态库的API时,动态库才会加载到程序当中。

通过 ldd (list dynamic dependencies)命令检查动态库依赖关系 列出可执行程序的动态库地址

ldd main
gzq@gzq:~/myproject/lesson06/library$ ldd main
	linux-vdso.so.1 (0x00007ffcd5162000)
	libcalc.so => not found
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f060dc63000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f060e256000)

当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib目录找到库文件后将其载入内存。

gzq@gzq:~$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/gzq/myproject/lesson06/library/lib
gzq@gzq:~$ echo $LD_LIBRARY_PATH
::/home/gzq/myproject/lesson06/library/lib
gzq@gzq:~/myproject/lesson06/library$ ldd main
	linux-vdso.so.1 (0x00007ffe31fec000)
	libcalc.so => /home/gzq/myproject/lesson06/library/lib/libcalc.so (0x00007f749e172000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f749dd81000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f749e576000)

在环境变量里配置动态库的绝对路径后  动态库就可以找到了  程序即可正常运行。(此方法在当前终端关闭后就无效了  每次打开新终端都需要配置一遍)

永久配置方法  用户级别配置、系统级别配置

用户级别:终端输入 ll 进入home目录 找到.bashrc隐藏文件  vim.bashrc编辑

  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/home/gzq/myproject/lesson06/library/lib

最后一行插入路径。配置完成后更新一下

source .bashrc

回到程序目录 ldd查看发现已经成功。

gzq@gzq:~/myproject/lesson06/library$ ldd main
	linux-vdso.so.1 (0x00007ffcef3bd000)
	libcalc.so => /home/gzq/myproject/lesson06/library/lib/libcalc.so (0x00007fd6f96f0000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd6f92ff000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd6f9af4000)

系统级别

$ sudo vim /etc/profile

编辑和更新同上。

配置/etc/ld.so.cache方法

sudo vim /etc/ld.so.conf    将路径添加到下方即可。

include /etc/ld.so.conf.d/*.conf
/home/gzq/myproject/lesson06/library/lib

sudo ldconfig 更新一下 即可成功

gzq@gzq:~/myproject/lesson06/library$ ldd main
	linux-vdso.so.1 (0x00007ffdfb338000)
	libcalc.so => /home/gzq/myproject/lesson06/library/lib/libcalc.so (0x00007f8543951000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8543560000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8543d55000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个头发很多的美女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值