Linux 靜態庫和動態庫的製作和使用
一、linux作業系統支援的函式庫分支
靜態庫:libxxx.a,在編譯時就將庫編譯進可執行程式
優點:程式的執行環境中不需要外部的函式庫
缺點:可執行程式大
動態庫:又稱共享庫,libxxx.so,在程式執行時將庫載入到可執行程式中
優點:可執行程式小
缺點:程式的執行環境中必須提供相應的庫
函式庫目錄:/lib /usr/lib
二、靜態庫的製作
① 生成目標檔案:gcc -c file.c
② 靜態庫的建立命令 ar
ar -cr libfile.a file.o
-c:Crete的意思
-r:replace的意思,表示當插入的模組file.o已經存在libfile.a中,則覆蓋。反之ar顯示一個錯誤資訊。
③ 操作靜態庫的幾個例項:
情況1:如果從別處得到一個靜態庫libunknown.a,想知道其中包含哪些模組。
命令--- ar -t libunknown.a
靜態庫的編譯:gcc -o main main.c -L. -lfile 編譯main.c 就會把靜態庫整合到main中。
其中:
-L:指定靜態函式庫的位置供查詢,注意L後面還有個. ,表示靜態庫在當前目錄查詢。
-l:則指定了靜態庫名,由於靜態函式庫的命名方式是lib***.a,其中lib和 .a可以忽略不寫。
④ 示例
三、動態庫的製作
① 生成目標檔案:gcc -c file.c
② gcc -shared -fpic -o libfile.so file.o
-fpic:產生位置無關程式碼
-shared:生成共享庫
用上述命令生成libfile.so動態函式庫。
gcc -o out main.c -L. -lfile
此時還不能立即執行./out ,因為在動態函式庫使用時,會預設在 /usr/lib或 /lib目錄下去查詢動態庫,而此時我們生成的庫不在裡面
③ 示例
第一種方法:
libfile.so方到 /lib 或 /usr/lib中去
第二中方法: 環境變數的方法,假設libsub.so在~/Coding/libsotest
執行 export LD_LIBRARY_PATH=~/Coding/libsotest
echo $LD_LIBRARY_PATH 檢視路徑是否新增成功
第三種方法:修改sheel配置指令碼
在/etc/ld.so.conf檔案里加入我們生成的庫目錄,然後/sbin/ldconfig
/etc/ld.so.conf是一個非常重要的目錄,裡面存放的是連結器和載入器搜尋共享庫時要檢查的目錄,預設是從/usr/lib
或/lib 中讀取,所以想要順利執行,可以把我們庫的目錄加入到這個檔案中並執行/sbin/ldconfig
① 開啟ld.so.conf檔案
② 向檔案中新增路徑
③ 用ldconfig執行sheel指令碼
④ 執行可執行程式
四、靜態庫和動態庫的大小比較
由此可見:
編譯成功後可執行程式,靜態庫比較大,因為這裡程式碼不多,所以看不到有很大差距