Linux下动态链接库和静态链接库

    Linux下的库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a。为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。例如:
    ln -s libhello.so.1.0 libhello.so.1

    ln -s libhello.so.1 libhello.so

一、使用库

      当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然 而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的 缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

    为了让执行程序顺利找到动态库,有三种方法:

        (1):把库拷贝到/usr/lib和/lib目录下。
        (2):通过设定环境变量LD_LIBRARY_PATH也可以指定动态库路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。例如动态库libhello.so在/home/ting/lib目录下,使用命令:
               export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/home/ting/lib

       在设置该环境变量后所有的命令中,该环境变量都有效。可以用echo命令查看 LD_LIBRAY_PATH 的设置内容:

               echo $LD_LIBRARY_PATH
        (3) :修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾。该文件中每一行是一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。这样,加入的目录下的所有库文件都可见。

    动态库的搜索路径搜索的先后顺序是:

        (1):编译目标代码时指定的动态库搜索路径;
        (2):环境量LD_LIBRARY_PATH指定的动态库搜索路径;

        (3):配置文件/etc/ld.so.conf中指定的动态库搜索路径;
        (4):默认的动态库搜索路径/lib;

       (5):.默认的动态库搜索路径/usr/lib。

    在上述(1)、(2)、(3)指定动态库搜索路径时,都可指定多个动态库搜索路径,其搜索的先后顺序是按指定路径的先后顺序搜索的。

二、生成库

生成静态库
    连接成静态库使用ar命令,其实ar是archive的意思
        ar cqs libhello.a hello.o
连接成动态库

    生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
        gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
    另外再建立两个符号连接:
        ln -s libhello.so.1.0 libhello.so.1
        ln -s libhello.so.1 libhello.so

    这样一个libhello的动态连接库就生成了。最重要的是传gcc -shared 参数使其生成是动态库而不是普通执行程序。-Wl 表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有soname名字的文件,而不是库的文件名,换句话说,soname是库的区分标志。这样做的目的主要是允许系统中多个版本的库文件共存,习惯上在命名库文件的时候通常与soname相同
        libxxxx.so.major.minor
    其中,xxxx是库的名字,major是主版本号,minor 是次版本号

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值