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\n",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. 加载速度较静态库较慢
posted @ 2019-08-03 11:20  王清河  阅读(431)  评论(0编辑  收藏  举报