linux下的靜態庫和動態庫

2021-07-27 03:43:49 字數 1132 閱讀 5223

庫是什麼

在我們實際程式設計中,經常會引入各種庫函式,那麼庫是什麼?從本質上來說是一種可執行**的二進位制格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。

靜態庫:linux下靜態庫的名字一般是lib***.a,***為庫的名字。利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標**中,他的優點是編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼所用到庫的程式必須重新編譯。

動態庫:linux下庫的動態庫名字一般是lib***.m.n.so,同樣的***為庫的名字,m是庫的主版本號,n是庫的副版本號。當然也可以不要版本號,但名字必須有。相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目標**中,程式執行到相關函式時才呼叫該函式庫裡的相應函式,因此動態函式庫所產生的可執行檔案比較小。而且並不是全部加入程式的,所以即使庫改變了,也能很方便的改變程式。

靜態庫和動態庫原理

當要使用靜態的程式庫時,聯結器會找出程式所需的函式,然後將它們拷貝到執行檔案,由於這種拷貝是完整的,一旦連線成功,靜態程式庫也就不再需要了。對動態庫而言,就不是這樣。動態庫會在執行程式內留下乙個標記指明當程式執行時,首先必須載入這個庫。由於動態庫節省空間,linux預設操作是首先連線動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連線。

制定編譯的時候使用的庫,例如:

gcc -lcurses hello.c 如使用libpthread.a -> gcc -lpthread hello.c

使用ncurses庫編譯程式  

-l

後面跟指定的lib的dirname,制定編譯的時候,搜尋庫的路徑。比如你自己的庫,可以用它制定目錄,不然編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。

-static

此選項將禁止使用動態庫,所以編譯出來的東西一般都很大,也不需要什麼動態連線庫,就可以執行

-share

此選項將盡量使用動態庫,所以生成檔案比較小,但是需要系統由動態庫

linux 下靜態庫和動態庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該 靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在 linux中如何建立...

linux下的靜態庫和動態庫

意義 為了避免 的重寫率,我們可以將已經寫好的 形成乙個庫,當我們再次用到的時候可以直接呼叫,而不是重新去寫,即 站在巨人的肩膀上 linux下有兩種庫 一 靜態庫 準備工作 int swap int x,int y include int main 1 將我們需要的函式生成乙個.o 檔案 root...

Linux下的靜態庫和動態庫

在我們平時寫 的時候,通常會引用一些庫檔案來幫助我們實現需要的功能,這些庫檔案是別人提前已經寫好的,我們只需要拿出庫檔案的介面來使用就可以了。這種庫檔案分為兩種,一種是靜態庫,一種是動態庫。靜態庫可以簡單的看成一組目標檔案集合,即很多目標檔案經過壓縮打包後形成乙個檔案。在靜態庫的載入過程中,第一步是...