靜態鏈結 動態鏈結

2022-08-15 04:21:18 字數 2025 閱讀 3600

所謂靜態、動態是指鏈結。回顧一下,將乙個程式編譯成可執行程式的步驟:

圖:編譯過程

靜態庫之所以成為【靜態庫】,是因為在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中。因此對應的鏈結方式稱為靜態鏈結。

試想一下,靜態庫與彙編生成的目標檔案一起鏈結為可執行檔案,那麼靜態庫必定跟.o檔案格式相似。其實乙個靜態庫可以簡單看成是一組目標檔案(.o/.obj檔案)的集合,即很多目標檔案經過壓縮打包後形成的乙個檔案。靜態庫特點總結:

l 靜態庫對函式庫的鏈結是放在編譯時期完成的。

l 程式在執行時與函式庫再無瓜葛,移植方便。

linux下建立與使用靜態庫

linux靜態庫命名規則

linux靜態庫命名規範,必須是"lib[your_library_name].a":lib為字首,中間是靜態庫名,擴充套件名為.a。

建立靜態庫(.a)

通過上面的流程可以知道,linux建立靜態庫過程如下:

l 首先,將**檔案編譯成目標檔案.o(staticmath.o)

g++ -c staticmath.cpp

注意帶引數-c,否則直接編譯為可執行檔案

l 然後,通過ar工具將目標檔案打包成.a靜態庫檔案

ar -crv libstaticmath.a staticmath.o

生成靜態庫libstaticmath.a

-------------------------------分割線------------------------

動態庫通過上面的介紹發現靜態庫,容易使用和理解,也達到了**復用的目的,那為什麼還需要動態庫呢?

為什麼還需要動態庫?

為什麼需要動態庫,其實也是靜態庫的特點導致。

l 空間浪費是靜態庫的乙個問題。

動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入。不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項,規避了空間浪費問題。動態庫在程式執行是才被載入,也解決了靜態庫對程式的更新、部署和發布頁會帶來麻煩。使用者只需要更新動態庫即可,增量更新

動態庫特點總結:

l 動態庫把對一些庫函式的鏈結載入推遲到程式執行的時期。

l 可以實現程序之間的資源共享。(因此動態庫也稱為共享庫)

l 將一些程式公升級變得簡單。

l 甚至可以真正做到鏈結載入完全由程式設計師在程式**中控制(顯示呼叫)。

window與linux執行檔案格式不同,在建立動態庫的時候有一些差異。

l 在windows系統下的執行檔案格式是pe格式,動態庫需要乙個dllmain函式做出初始化的入口,通常在匯出函式的宣告時需要有_declspec(dllexport)關鍵字

l linux下gcc編譯的執行檔案預設是elf格式,不需要初始化入口,亦不需要函式做特別的宣告,編寫比較方便。

與建立靜態庫不同的是,不需要打包工具(ar、lib.exe),直接使用編譯器即可建立動態庫。

動態鏈結 靜態鏈結

在linux系統中,ld鏈結器將彙編器編譯出來的目標檔案和靜態庫里的.a檔案鏈結生成可執行檔案。靜態庫中的.a檔案的 會在靜態鏈結過程中新增到可執行檔案中,可執行檔案會變得很大。與靜態鏈結不同,linux系統的ld鏈結器會將動態庫.so檔案進行符號重定位生成可執行檔案,動態庫.so檔案並不新增到可執...

靜態鏈結 動態鏈結

如果函式庫的乙份拷貝是可執行檔案的物理組成部分,那麼我們稱之為靜態鏈結。如果可執行檔案只是包含了檔名,讓載入器在執行時能夠尋找程式所需的函式庫,那麼稱為動態鏈結。即根據函式庫是不是可執行檔案的組成部分區分靜態鏈結和動態鏈結。1 可執行檔案的體積小。2 雖然執行速度稍慢,但是能更加有效的利用磁碟空間,...

靜態鏈結和動態鏈結

靜態載入dll dll工程b 專案屬性 配置屬性 常規 配置型別 動態庫 dll 在宣告檔案中,宣告匯出函式 declspec dllexport int xx 如果是c檔案,要在c 檔案中被呼叫,註明extern c 可以 ifdef cplusplus extern c endif 呼叫dll的...