?
?
?
命令規則
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(絕對路徑)
?
解決動態庫無法加載
- 需要找到動態鏈接器的配置文件
- 動態庫的路徑寫到配置文件中
- 更新 ?sudo idconfig -v
?
cd etc
ls -l ld.so.conf
vi ld.so.conf
(o 在當前行下行創建一行)
將動態庫路徑寫到該配置文件中(絕對路徑)
sudo idconfig -v
動態庫的優點:
- 執行程序體積小
- 動態庫更新方便(接口沒變)
?
缺點:
- 發布程序時,需要將動態庫發布給用戶
- 加載速度較靜態庫較慢