静态库与动态库的制作与使用

静态库与动态库

  1. 什么是库

    • 库文件是计算机上的一种文件,可以把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量,函数或类
    • 库是一种特殊的程序,但是库不能单独运行
    • 库文件有两种,静态库和动态库,区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用
    • 库的好处:
      • 代码保密
      • 方便部署和分发
  2. 静态库的制作

    • 命名规则:

      • Linux: libxxx.a
        lib :前缀(固定)

        xxx:库的名字,自己起
        .a:后缀(固定)

      • Windows:libxxx.lib

    • 制作:

      • gcc -c获得源文件的.o文件

      • 将用到的.o文件打包,使用ar工具
        ar rcs libxxx.a xxx.o xxx.o
        r -将文件插入备存文件中
        c -建立备存文件

        s -索引

    • 工作原理:
      GCC 进行链接时,会把静态库中代码打包到可执行程序中,最后直接运行可执行程序即可

    • 使用:
      note:

      • 使用库的时候,我们把封装好的库给别人,同时也要将库所依赖的头文件给别人,因为别人只拿到库文件的话,不知道这个库里面有什么东西,只有 通过头文件里的函数声明,别人知道有那些函数,才能够去使用
      • 我们在用gcc -l命令查找库文件的时候,注意指定的是libxxx.a中的xxx,因为libxxx.a是动态库文件的名称,xxx才是动态库的名称
  3. 动态库的制作

    • 命名规则:

      • Linux: libxxx.so
        lib: 前缀(固定)
        xxx:库的名字,自己起
        .so:后缀(固定)
        在Linux下是一个可执行文件

      • Windows: libxxx.dll

    • 制作:

      • gcc -c获得源文件的.o文件,与静态库制作不同的是,这一步要用gcc -c -fpic/-FPIC a.c b.c来得到和位置无关的代码
      • gcc得到动态库
        gcc -shared a.o b.o -o libcakc.so
    • 工作原理:
      GCC进行链接时,动态库的代码不会被打包到可执行程序中,程序运行起来之后,当用到库中的api时,它会由动态载入器去以下列表中DT_RPATH段---->环境变量LD_LIBRARY_PATH--->etc/ld.so.cache文件列表----> /lib/,user/lib寻找库的绝对路径,找到库文件之后,再将其载入内存

    • 使用
      动态库与静态库的编译过程是一样的,但是在运行最后的可执行文件时,静态库直接运行就行,但是动态库不可以。因为编译的时候只是把动态库的一些可执行信息放到可执行程序中,并不会加载动态库的内容到内存中,所以编译阶段不会报错,但是运行的时候用到了动态库的内容,就需要把动态库加载到内存中。

      如何向配置文件里面加入动态库绝对路径

      1. cd 进入home目录下

      2. 找到.bashrc,并配置这个文件

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zg5rHeC-1651039392157)(C:\Users\zjy\AppData\Roaming\Typora\typora-user-images\image-20220427135210554.png)]

      3. shif+g跳到最后一行
        o 往下插入一行
        输入以下命令,后面的内容根据自己的库的绝对路径来填写
        :wq保存并退出

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUA1U0Pv-1651039392158)(C:\Users\zjy\AppData\Roaming\Typora\typora-user-images\image-20220427135304601.png)]

      4. 使文件生效(箭头的两种方式都行)
        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GvztRnV-1651039392159)(C:\Users\zjy\AppData\Roaming\Typora\typora-user-images\image-20220427135527416.png)]

  4. 最后贴几张图回顾一下

在这里插入图片描述
在这里插入图片描述

  1. 静态库与动态库的优缺点
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Humxmd4E-1651039392159)(C:\Users\zjy\AppData\Roaming\Typora\typora-user-images\image-20220427135800836.png)]

note:为什么更新麻烦:因为每次更新了库,都需要重新编译链接文件
​ 为什么发布程序无需提供静态库:因为静态库在链接的时候已经在程序里了

note:为什么更新简单:因为只需要更新库就好了,不需要重新编译整个程序,库是在运行时动态加入内存的
所以发布程序时需要提供依赖的动态库,不然用户没法使用

整理自牛客网Linxu系统编程课程列表_牛客网 (nowcoder.com)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值