• Linux系统编程03动态库


    动态库制作

    • 命名规则
      • Linux: libxxx.so
        • lib: 前缀
        • xxx: 库的名字
        • .so: 后缀
      • Windows: libxxx.dll
    • 制作:
      • gcc 生成 .o 文件, 得到和位置无关的代码 gcc -c -fpic/fPIC a.c b.c
      • gcc 生成动态库 gcc -shared a.o b.o -o libcalc.so

    实例:

    add.c

    #include <stdio.h>
    #include "head.h"
    int add(int a, int b)
    {
        return a+b;
    }
    

    div.c

    #include <stdio.h>
    #include "head.h"
    double divide(int a, int b)
    {
        return (double)a/b;
    }
    

    mult.c

    #include <stdio.h>
    #include "head.h"
    int multiply(int a, int b)
    {
        return a*b;
    }
    

    sub.c

    #include <stdio.h>
    #include "head.h"
    int subtract(int a, int b)
    {
        return a-b;
    }
    

    head.h

    #ifndef _HEAD_H
    #define _HEAD_H
    
    // 加法
    int add(int a, int b);
    // 减法
    int subtract(int a, int b);
    // 乘法
    int multiply(int a, int b);
    // 除法
    double divide(int a, int b);
    
    #endif
    

    main.c

    #include <stdio.h>
    #include "head.h"
    
    int main()
    {
        int a = 20;
        int b = 12;
        printf("a = %d, b = %d\n", a, b);
        printf("a + b = %d\n", add(a, b));
        printf("a - b = %d\n", subtract(a, b));
        printf("a * b = %d\n", multiply(a, b));
        printf("a / b = %f\n", divide(a, b));
        return 0;
    }
    
    1. 生成位置无关代码 gcc -c -fpic add. c div.c mult.c sub.c 生成目标文件

    2. 生成动态库gcc -shared *.o -o libcalc.so

    3. 整理目录:

    1. 使用动态库: gcc main.c -o main -I ./include -L ./lib -l calc

    2. 执行main 时会报错 error while loading shared libraries: libcalc.so : cannot open shared object file: No such file or directory

    定位共享库文件

    环境变量方法

    • env 可以查看环境变量

    • 临时配置export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib

    • 用户级别的配置, 打开.bashrc, 最下面输入exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib, 输入 source .bashrc生效(推荐此方法)

    • 系统级别的配置 sudo vim /etc/profile, 最下面输入exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib, source /etc/profile生效

    • 使用 ldd main 查看动态库

              linux-vdso.so.1 (0x00007ffe9bdee000)
              libcalc.so => /home/xxx/lib/libcalc.so (0x00007fe7524f6000)
              libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe7522f1000)
              /lib64/ld-linux-x86-64.so.2 (0x00007fe752502000)
      
    • 运行程序 ./main

      a = 20, b = 12
      a + b = 32
      a - b = 8
      a * b = 240
      a / b = 1.666667
      

    修改文件方法

    无法直接修改/etc/ld.so.cache, 需要编辑sudo /etc/ld.so.conf, 添加动态库的路径, 更新sudo ldconfig 即可

    放入指定目录方法

    直接放入 /lib/, /usr/lib目录, 系统的动态载入器能直接扫描到. (不推荐此方法)

  • 相关阅读:
    hadoop
    spark
    docfetcher
    redis参考资料
    Redis系列-存储篇sorted set主要操作函数小结
    predis操作大全
    composer安装使用
    寒假作业2
    寒假作业随笔
    面向对象寒假作业编程题
  • 原文地址:https://www.cnblogs.com/anqwjoe/p/16793178.html
Copyright © 2020-2023  润新知