命令规则

  lib + 名字 + .so

制作步骤

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

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

发布和使用共享库

动态库运行原理:

Linux之动态库-LMLPHP

生成动态库:

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

Linux之动态库-LMLPHP

打包动态库并移动

Linux之动态库-LMLPHP

使用动态库:

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

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

Linux之动态库-LMLPHP

动态库的优点:

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

缺点:

  1. 发布程序时,需要将动态库发布给用户
  2. 加载速度较静态库较慢
05-20 07:42