• _Linux 动态库


    0. 前言

    链接:静态库文章
    上一章我们讲解了静态库的生成和两种使用,我们这章来谈谈动态库。

    举个例子:
    动态库:在一个100米跑道上中间有两个电线杆相距20米;
    静态库:第一个电线杆与终点的距离是60米。

    现在我们把跑道改为200米,那么静态库的距离就是错误的,它已经失效了;但动态库的两个电线杆的相对距离不变。

    本章演示代码:(就是静态库那章代码)

    /mymath.h/
    #pragma once
    #include
    extern int MyAdd(int a, int b);
    /mymath.c/
    #include"mymath.h"
    int MyAdd(int a, int b)
    {
      return a+b;
    }
    
    /myprint.h/
    #pragma once
    #include
    #include
    extern void MyPrint(const char* str);
    /myprint.c/
    #include"myprint.h"
    void MyPrint(const char* str)
    {
      printf("%s[%d]\n", str, (int)time(NULL));
    }
    
    ///main.c
    #include "myprint.h"
    #include "mymath.h"
    int main()
    {  
      MyPrint("hello world");
      int res = MyAdd(1,100);
      printf("res: %d\n", res);
    
      return 0;
    }
    ————————————————
    版权声明:本文为CSDN博主「潜水少年请求出战」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Dingyuan0/article/details/127649870
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    1. 生成动态库

    • shared: 表示生成共享库格式

    • fPIC:产生位置无关码(position independent code)

    • 库名规则:libxxx.so
      生成动态库的指令如下:

        gcc -fPIC -c mymath.c -o mymath_d.o
        gcc -fPIC -c myprint.c -o myprint_d.o
        gcc -shared mymath_d.o myprint_d.o -o libhello.so
      
      • 1
      • 2
      • 3

    上面.o文件前加个_d目的只是为了与上一章静态库生成的.o文件作区别。

    1.1 我们把静态库和动态库打包

    指令如下:

      mkdir -p output/lib
      mkdir -p output/include
      cp -rf *.h output/include
      cp -rf *.a *.so output/lib
    
    • 1
    • 2
    • 3
    • 4

    打包后按二叉树分布是下面这个样子:
    在这里插入图片描述

    1.2 当动静库同时存在的时候默认生成的是动态库

    如果只有静态库那就链接的是静态库。
    什么意思那?
    实操如下:

    gcc main.c -I ./output/include/ -L ./output/lib/ -lhello
    
    • 1

    使用上面的指令我们发现运行可执行文件就出错了
    在这里插入图片描述
    原因是:默认生成的是动态库,而可执行文件和动态库分批加载到内存中;可是我们只告诉了gcc未告诉系统我们这是一个动态库所以就报错了。
    在这里插入图片描述

    1.3 -static

    那么两个库同时存在,我就想使用静态库,怎么操作的?
    只需在原来的指令上加 -static就可以了
    在这里插入图片描述

    2. 动态库的使用

    编译选项
    l:链接动态库,只要库名即可(去掉lib以及版本号)
    L:链接库所在的路径

    2.1 运行动态库的方法

    1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib

    • 就是拷贝到系统路径下,静态库说过,我们不建议这样作。

    2、更改 LD_LIBRARY_PATH

    [Ding@VM-4-6-centos uselib]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/Ding/my/22116/uselib/output/lib
    
    • 1

    在这里插入图片描述

    3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

    • 先在 /etc/ld.so.conf.d/ 路径下创个文件(sudo是一个root指令)

      [Ding@VM-4-6-centos uselib]$ sudo touch /etc/ld.so.conf.d/Ding.conf
      
      • 1
    • 在这个新创的文件下,存动态库的路径就可以了
      在这里插入图片描述

    • 然后跟新一下ldconfig更新

      sudo ldconfig
      
      • 1

    4、动态库与路径建立软链接。
    例子:

    sudo ln -s /home/Ding/my/22116/uselib/output/lib/libhello.so  /lib64/libhello.so
    
    • 1

    注意:二、三区别是,二是把环境变量写到内存中,我们退出系统自动就清楚路径了;三是下次登录时,仍然有效。

    3. 库文件名称和引入库的名称

    • 如:libc.so -> c库,去掉前缀lib,去掉后缀.so或.a
  • 相关阅读:
    福布斯:Salesforce和ZohoCRM,哪个更适合你?
    volatile修饰数组
    Python可变类型的坑,不要再踩了
    计算机网络基础 ARP协议 详详解----看完我的总结你就不用看别人的了!
    MyCat|Shardingsphere-proxy:jdbc连接MySQL8.0.33的query_cache_size异常解决方案
    new/delete 和malloc/free的区别
    Zookeeper学习笔记(1)—— 基础知识
    基于物联网的农村地区智能微电网系统(Simulink)
    【管理运筹学】第 9 章 | 网络计划(2,时间参数的计算 —— 工作的时间参数)
    【BOOST C++ 11 时钟数据】(3)时间(11-14)
  • 原文地址:https://blog.csdn.net/Dingyuan0/article/details/127712738