1、linux作業系統支援的函式庫分為靜態庫和動態庫,動態庫又稱為共享庫。函式庫檔案主要存放在/lib /usr/lib
2、不管是靜態函式庫還是動態函式庫,都是由*.o目標檔案生成
這類庫檔案以lib***.a;利用靜態函式庫編譯成的檔案較大,因為整個庫的所有資料都會被整合到目標**中。
優點:編譯後的程式不需要外部的函式庫支援
缺點:如果靜態函式庫改變了,程式必須重新編譯,並且體積大
動態庫檔案的名字一般是lib***.so,動態庫又稱為共享庫,相對於靜態庫,動態函式庫在編譯時沒有被編譯到目標**中,程式執行到相關函式時才會該函式庫裡面相應的函式。
優點:多個應用程式使用同一函式庫,減少應用程式的體積
缺點:由於函式庫沒有整合到程式,所以程式的執行環境中必須提供相應的庫
例如: add.h add.c sub.h sub.c main.c
#ifndef add_h
#define add_h
int add(int
x,int
y);
#endif
#include
#include "add.h"
int add(int
x,inty)
#ifndef sub_h
#define sub_h
int sub(int x,int y);
#endif
// sub.c
#include #include "sub.h"
int sub(int x,int y)
#include
#include "sub.h"
#include "add.h"
int main()
不管是靜態函式庫還是動態函式庫,都是由 *.o目標檔案生成。
首先: gcc -c add.c
gcc -c sub.c
生成:add.o sub.o
1、靜態函式庫由ar命令建立
//建立靜態庫 libaddsub.a
ar -cr libaddsub.a
add.o
sub.o
-c create2、使用方法-r replace,當插入的模板名已經在庫中粗在,則替換;不存在則出錯。預設情況下,新增的成員在庫的結尾處。
//將靜態庫整合到main中
gcc -o main main.c -l
.-laddsub
-l 指定靜態函式庫的位置 供查詢,「.」表示靜態函式庫在本目錄下查詢特點:由於靜態庫的內容已經整合到了目標**中,因此,此處 刪除 libaddsub.a檔案,main 依然可以執行-l 指定了靜態函式庫名,由於靜態函式庫命名方式是lib***.a,其中的lib和.a忽略
//動態函式庫的建立
gcc -shared -fpic -o libaddsub.so
add.c
sub.c
-fpic 產生位置無關的**2、使用-shared 生成共享庫
//使用
gcc -o out main.c -l
.-laddsub
此時還不能立即./out,因為在動態函式庫使用時,會查詢/usr/lib /lib目錄下的動態函式庫,而此時我們生成的庫不在裡邊。
方法:
1、將libaddsub.so 貼上到 /usr/lib /lib1、靜態庫檔案的建立和使用,建立ok之後,直接將庫整合到目標檔案中2、設定環境變數
假設libaddsub.so在/home/linux/addsub
export ld_library_path=/home/linux/addsub:$ld_library_path
2、動態庫檔案的建立和使用,包括鏈結和載入兩個部分,建立和靜態庫差不多,載入時可以通過上面兩種方法
Linux下的靜態庫與動態庫
準備三個檔案 time.c time.h test.c。函式庫的標頭檔案 ifndef time h define time h includevoid time endif time h 函式庫的源程式,包含時間列印函式 include time.h void time 測試函式,呼叫了時間列印函...
Linux下的靜態庫與動態庫
1 生成.so g test.cpp fpic shared o libtest.so 2 使用.so g l.ltest main.cpp 在使用.so的時候如果找不到.so需要把.so的路徑加到 etc ld.so.conf ldconfig使之生效 ldd 可以檢視main中是否包含了.so。...
Linux下的靜態庫與動態庫
在windows和linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的 你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份 都從頭編寫,當...