linux下靜態庫動態庫的製作和使用
動態庫與靜態庫本質是二進位制的原始碼,只是人看不懂,對機器沒有影響。
靜態庫的製作和使用
命名規則:
名字一般分為三部分,開頭為“lib”,表示這是一個庫檔案,接下來是想取的名字,最後是字尾“.a”(windows下是lib)。例如:libhello.a
製作步驟:
1.原材料:原始碼
2.將.c生成.o
3.將-o打包:ar rcs 靜態庫的名字 .o檔案
靜態庫的使用:
將使用到庫的檔案與其進行連線:
gcc -I 標頭檔案目錄 -L 庫目錄 -l 庫名字 -o 可執行檔名
//這個庫名字就是拋去lib字首和.a字尾的檔名
優點:
1.靜態庫被打包到應用程式中,載入速度快;
2.釋出程式無需提供靜態庫,移植方便。
缺點:
1.銷燬系統資源,浪費記憶體;
2.更新、部署、釋出麻煩。
動態庫的製作與使用
命名規則:
名字一般分為三部分,開頭為“lib”,表示這是一個庫檔案,接下來是想取的名字,最後是字尾“.so”(windows下是dll)。例如:libhello.so
製作步驟:
1.原材料:原始碼
2.將.c生成.o:
gcc a.c b.c -c -fpic
3.將-o打包:
gcc -shared -o libxxx.so a.o b.o
靜態庫的使用:
將使用到庫的檔案與其進行連線:
gcc -I 標頭檔案目錄 -L 庫目錄 -l 庫名字 -o 可執行檔名 //這個庫名字就是拋去lib字首和.so字尾的檔名
解決動態庫載入失敗的問題
動態庫直接按上面的方式使用,可能會出現沒有找到該檔案的情況。這種情況的出現是由於動態庫的工作模式與靜態庫的工作模式不同所導致。
動態庫在打包的時候使用的是gcc命令,這樣生成的檔案是elf格式的,對於elf格式的可執行程式,是由ld-linux.so*來完成的,它先後搜尋elf檔案的DT_RPATH段——環境變數LD_LIBRARY_PATH——/etc/ld.so.cache檔案列表——/lib/或/user/lib/目錄,找到庫檔案後將它載入記憶體。
方法一:使用環境變數讓系統找到庫:
臨時設定:
在終端輸入:export LD_LIBRARY_PATH = 動態庫路徑(最好是絕對路徑): $LD_LIBRARY_PATH
最後的:和之後部分表示對原有內容做拼接操作,避免覆蓋變數中原有的值。
這種方式在當前終端中有效,重開一個終端仍然找不到。
永久設定:
使用者級別:
將以上的語句寫入~/.bashrc
配置完成後需重啟終端或輸入命令:source ~/.bashrc
系統級別:
將以上語句寫入/etc/profile
配置完成後需重啟電腦或輸入命令:source /etc/profile.
方法二:更新/etc/ld.so.cache檔案列表
找到配置檔案:
開啟etc/ld.so.conf,將動態庫的絕對路徑寫入。
執行命令:
sudo ldconfig -v
優點:
1.可實現程序間資源共享;
2.程序升級簡單;
3.可以控制何時載入動態庫;
4.動態庫在記憶體中只佔一份記憶體(共享區),避免了資源的浪費。
缺點:
1.載入速度比靜態庫慢;
2.釋出程式需要提供所依賴的動態庫