Linux下製作動態庫與靜態庫

2021-07-16 08:08:49 字數 1452 閱讀 2265



靜態函式庫:

1.這類庫的名字一般是lib***.a

;2.利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標**中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進可執行檔案了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼你的程式必須重新編譯,而且體積也較大

動態函式庫:

這類庫的名字一般是lib***.so

,動態庫又稱共享庫

;相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目標**中,你的程式執行到相關函式時才呼叫該函式庫裡的相應函式,因此動態函式庫所產生的可執行檔案比較小。由於函式庫沒有被整合進你的程式,而是程式執行時動態的申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的公升級比較方便。而且如果多個應用程式都要使用同一函式庫,動態庫就非常適合,可以減小應用程式的體積

建立過程:

例程add.h add.c sub.h  sub.c  main.c: 

不管是靜態函式庫還是動態函式庫,都是由*.o目標檔案生成。

所以先      gcc -c add.c

gcc -c sub.c

生成    add.o  sub.o

靜態函式庫由ar命令建立

本例:ar -cr libaddsub.a add.o sub.o

-c create的意思

-r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。如果若干模組中有乙個模組在庫中不存在,ar顯示乙個錯誤訊息,並不替換其他同名模組。預設的情況下,新的成員增加在庫的結尾處,可以使用其他任選項來改變增加的位置。

到此靜態函式庫建立完畢。

使用方法:

通過gcc main -o main -l. -laddsub編譯main.c就會把靜態函式庫整合進main。

其中-l指定靜態函式庫的位置供查詢,注意l後面還有'.',表示靜態函式庫在本目錄下查詢。

-l則指定了靜態函式庫名,由於靜態函式庫的命名方式是lib***.a,其中的lib和.a忽略。

根據靜態函式庫的特性,此處刪除libaddsub.a後main依然可以執行,因為靜態庫的內容已經整合進去了。

動態函式庫的建立和使用

gcc -shared -fpic -o libaddsub.so  add.c sub.c

-fpic:產生位置無關**

-shared:生成共享庫

用上述命令生成libaddsub.so 動態函式庫。

gcc -o out main.c -l. -laddsub

此時還不能立即./out,因為在動態函式庫使用時,會查詢/usr/lib /lib目錄下的動態函式庫,而此時我們生成的庫不在裡邊。

這個時候有好幾種方法可以讓他成功執行:

最直接最簡單的方法就是把libaddsub.so拉到/usr/lib 或/lib中去。 

Linux下靜態庫與動態庫的製作

二者的不同點在於 被載入的時刻不同。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫,因此體積較大 動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在,因此 體積較小。現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開...

Linux下製作靜態庫和動態庫

所謂庫檔案,就是一堆函式的集合。一堆函式原始碼的集合 c 一堆二進位制函式 的集合 so 使用者可以呼叫庫裡面的函式,但是沒有辦法看到函式的實現過程。在linux裡面,庫有兩種,一種是靜態庫 lib x.a 另外一種是動態庫 共享庫 lib x.so 例子 libabc.so.0.8 lib 庫的字...

Linux下gcc使用與動態庫靜態庫製作

1.gcc工作流程 1.預處理 gcc e 2.編譯 gcc s 3.彙編 gcc c 4.鏈結 沒引數 2.常用引數 o 指定生成的檔案的名字 d 在編譯的時候定義巨集 控制log的輸出 i 指定標頭檔案的路徑 g gdb除錯的時候需要新增該引數 o 編譯優化,3個等級 o 1 3 wall 編譯...