• Linux之动态库


      

    命令规则

      lib + 名字 + .so

    制作步骤

      1)生成与位置无关的代码(生成与位置无关的代码)

      2)将.o打包成共享库(动态库)

    发布和使用共享库

    动态库运行原理:

    生成动态库:

      gcc -fPIC -c *.c -I ./include

    打包动态库并移动

    使用动态库:

    /***
    main.c
    ***/
    
    #include<stdio.h>
    #include"MyCalc.h"
    
    int main()
    {
        int a = 10;
        int b = 20;
        int result = a + b;
        printf("a + b = %d
    ",result);
        return 0;
    }

    ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ gedit main.c

    ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ gcc main.c -Iinclude -L ./lib/ -lMyCalc -o myapp

    ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ ls

    app  include  lib  main.c  myapp  src

    ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ ./myapp

    a + b = 30

    ldd 命令:查看程序执行时依赖的所有的库

    ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ ldd myapp

           linux-vdso.so.1 =>  (0x00007fffe8d13000)

           libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92ffac7000)

           /lib64/ld-linux-x86-64.so.2 (0x00007f92ffe91000)

    设置动态库环境变量(临时)

    export LD_LIBRARY_PATH=./lib

    永久生效:

    bansh.rc

    将export LD_LIBRARY_PATH=./lib(绝对路径)

    解决动态库无法加载

    1. 需要找到动态链接器的配置文件
    2. 动态库的路径写到配置文件中
    3. 更新  sudo idconfig -v

    cd etc

    ls -l ld.so.conf

    vi ld.so.conf

    (o 在当前行下行创建一行)

    将动态库路径写到该配置文件中(绝对路径)

    sudo idconfig -v

    动态库的优点:

    1. 执行程序体积小
    2. 动态库更新方便(接口没变)

    缺点:

    1. 发布程序时,需要将动态库发布给用户
    2. 加载速度较静态库较慢
  • 相关阅读:
    PHP 数组函数分类整理
    mysql 数据库中 int(3) 和 int(11) 有区别么???
    理解PHP的运行机制
    类与对象
    PHP函数补完:call_user_func()
    linux 软件安装目录详解
    Linux下安装Redis
    Redis简介,应用场景,优势
    idea自动抽取变量快捷键设置
    全局捕获异常(适用于SpringMvc,SpringBoot项目)
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11294197.html
Copyright © 2020-2023  润新知