动态库(共享库)的制作和使用

 Linux下的动态库为lib*.so格式的二进制文件(目标文件),对应于Windows下的.dll格式的文件。

1)命名规则

lib+库名+.so

2)动态库的制作

1)生成与位置无关的代码(.o)  2)将.o文件打包成动态库(共享库)

        仍然以上篇文章的代码为例。

[root@localhost src]# gcc -fPIC -c *.c 
[root@localhost src]# ls
add.c  add.o  div.c  div.o  mul.c  mul.o  sub.c  sub.o      //这几个.o文件已经是库函数了,它们是与位置无关的代码。PIC可以小写也可以大写,表示生成与位置无关的代码。

[root@localhost src]# gcc -shared *.o -o libMytest.so
[root@localhost src]# ls
add.c  add.o  div.c  div.o  libMytest.so  mul.c  mul.o  sub.c  sub.o   // 将所有.o文件打包到动态库libMytest.so中

3)发布和使用动态库(共享库)

ldd命令用来显示二进制代码文件动态库的链接情况,如:ldd foo。将生成的libMytest.so库文件和头文件head.h发送给客服,客服就可以根据头文件中的接口情况,来知道库文件的功能 (具体怎么实现的他也不知道),从而客服就可以使用库文件来完成自己的工作了(main.c):

[root@localhost Calc]# gcc -pedantic -Wall -pipe main.c -I include/ -L src/ -lMytest -o zsx   //等价于: gcc -pedantic -Wall -pipe main.c -I include/ src/libMytest.so -o zsx
[root@localhost Calc]# ls
include  lib  main.c  src  zsx
[root@localhost Calc]# ldd zsx
    linux-vdso.so.1 =>  (0x00007ffffa7e8000)
    libMytest.so => not found
    libc.so.6 => /lib64/libc.so.6 (0x00007f591dc98000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f591e078000)    //  ld-linux-x86-64.so.2为动态链接器库文件(二进制文件),程序在执行时,动态库的调用需要动态链接器(一个程序,二进制代码文件)来进行调用。动态链接器是按照一定的规则去查找动态库文件的,即按照动态库的环境变量中的每个路径依次进行查找。Linux系统的/lib中就存放了系统在启动时候就需要用到的一些动态库。由ldd zsx可以看出,动态链接器无法找到代码所需要的动态库文件,即该动态库文件不在动态链接器的搜索路径中,下面给出几种解决方法:

1.将库文件libMytest.so放在/lib中就可以了,这样链接器就可以找到该库文件。但是,不建议这样做,因为是系统的库文件目录,如果名字冲突就会发生故障。

2.设置环境变量LD_LIBRARY_PATH的值。

[root@localhost Calc]# echo $LD_LIBRARY_PATH

[root@localhost Calc]# export LD_LIBRARY_PATH=/mnt/hgfs/share/gcc/Calc/src/libMytest.so
[root@localhost Calc]# echo $LD_LIBRARY_PATH
/mnt/hgfs/share/gcc/Calc/src/libMytest.so

此时链接器会首先在环境变量LD_LIBRARY_PATH中查找库文件,没有在去其余环境变量中查找。该方法也只是临时有效,当关闭终端后,环境变量LD_LIBRARY_PATH的值又恢复了空值,因此又需要再次设置!这种方法仅适用于:在开发测试动态库过程中使用,因为仅仅临时有效。在测试开发完成后,就需要一种稳定的方法。

3.修改当前用户的bash配置文件:~/.bashrc  修改完成后,需要关闭终端然后再次启用终端,该配置才会生效。

[root@localhost ~]# vim ~/.bashrc

export LD_LIBRARY_PATH=/mnt/hgfs/share/gcc/Calc/src

重启终端:

[root@localhost ~]# echo $LD_LIBRARY_PATH
/mnt/hgfs/share/gcc/Calc/src
即:  该路径永久生效

4.修改动态链接器的配置文件:/etc/ld.so.conf。将动态库的路径写到配置文件中,将libMytest.so所在绝对路径追加入到/etc/ld.so.conf文件;使用ldconfig -v 更新,使配置生效。

[root@localhost ~]# vim /etc/ld.so.conf
/mnt/hgfs/share/gcc/Calc/src

[root@localhost ~]# ldconfig -v

总结:

1).放到系统的库目录中 -- 不允许使用

2).临时测试

环境变量: LD_LIBRARY_PATH=将动态库的路径设置给该变量

将设置的值, 导入到系统环境变量中: export LD_LIBRARY_PATH

当终端关闭, 设置会失效

3).不常用的方法(永久设置):

在家目录的 .bashrc文件 中添加一句话: export LD_LIBRARY_PATH=动态库目录的绝对路径

.bashrc修改完成, 需要重启终端

4).常用的方法(永久设置)

1. 需要找动态连接器的配置文件 --  /etc/ld.so.conf

2. 动态库的路径写到配置文件中

3. 更新 ldconfig –v  v参数表示显示更新过程的详细信息

(4)动态库的优缺点

优点:执行程序体积小;动态库更新了,在接口不变的情况下,不需要重新编译程序,只需要保证新库跟旧库名称一样,接口一样,且新库能够被链接器找的到;

缺点:在发布最终版本的应用程序时,需要将动态库提供给客服;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值