一、概述
二、動態庫的優缺點
機制:
- 共享庫的代碼是在可執行程序運行時才載入內存的,在編譯過程中僅簡單的引用,因此代碼體積較小。
優點:
- 節省內存(共享)
- 易於更新(動態鏈接)
- 停止運行程序
- 使用新庫覆蓋舊庫(保證新舊庫名稱一致,接口一致)
- 重新啓動程序
缺點:
- 延時綁定,速度略慢
使用場合:
- 對速度要求不是很強烈的地方都應使用動態庫
注意事項:
- 動態庫是否加載到內存,取決於程序是否運行
命名格式:
- lib開頭
- 動態庫名
- .so結尾
三、動態庫的製作
(1)製作步驟
1)生成“與位置無關“的目標文件。
gcc -fPlC a.c b.c c.c -c
- 參數:-PIC 表示生成與位置無關代碼
- 執行完畢後生成一系列的 .o 文件
2)製作動態庫
gcc -shared -o libmytest.so a.o b.o c.o
- 參數:-shared 製作動態庫
- -o:重命名生成的新文件
3)使用動態庫
gcc main.c -L ./ -Imytest -I / -o app
- -L–>指定庫所在的路徑
- 去掉前綴 lib
- 去掉後綴 .so
- 只留下中間部分
- -I–>頭文件目錄位置
/.app–>運行失敗
- 查看依賴的共享庫:ldd app 發現 libmytest 找不到
- 沒有給動態鏈接器(ld-linux.so.2)指定好動態庫 libmytest.so 的路徑
- 解決方案
- 臨時設置:export LD_LIBRARY_PATH=庫路徑,將當前目錄加入環境變量,但是終端退出了就無效
- 永久設置:將上條寫入家目錄下 .bashrc 文件中
- 粗暴設置:直接將 libmytest.so 文件拷貝到 /usr/lib/【/lib】目錄下。(受 libc 庫的啓發)
- 將 libmytest.so 所在絕對路徑追加入到 /etc/ld.so.con 文件,使用 sudo ldconfig-v 更新
(2)實際操作
- 生成 .o 目標文件,文件路徑和內容同上,進入到 src 目錄,生成 .o 目標文件:
- 將 .o 文件打包生成動態庫
- 使用生成的動態庫,-L 指定動態庫路徑 -l 指定庫名
gcc main.c -o main -I include/ -L ./lib -lCalc
- 退出到 dongtai 目錄下,將動態庫拷貝到 lib 目錄下並編譯 main.c 並執行 main:
無法找到動態庫目標文件,解決方法有三個:
(1)拷貝到 /lib 下(不允許,容易與別人庫命名重合)
(2)將庫路徑增加到環境變量 LD_LIBRARY_PATH 中(不是特別推薦)
(3)配置 /etc/ld.so.conf 文件,增加 /home/linux/dongtai/lib/ 路徑,執行 ldconfig -v,並執行 main