動態鏈結 靜態鏈結

2021-09-27 00:07:58 字數 1226 閱讀 9593

在linux系統中,ld鏈結器將彙編器編譯出來的目標檔案和靜態庫里的.a檔案鏈結生成可執行檔案。靜態庫中的.a檔案的**會在靜態鏈結過程中新增到可執行檔案中,可執行檔案會變得很大。

與靜態鏈結不同,linux系統的ld鏈結器會將動態庫.so檔案進行符號重定位生成可執行檔案,動態庫.so檔案並不新增到可執行檔案中。執行可執行檔案,會自動鏈結到記憶體裡的.so動態庫檔案。

參考連線:

gcc -c lib.c
編輯lib.c原始檔,使用gcc編譯器編譯生成目標檔案lib.o

ar cr lib.a lib.o
生成lib.a靜態庫檔案

gcc -fpic -shared -o lib.so lib.c
生成lib.so動態庫檔案

gcc -o program program.c ./lib.so ./lib.a
通過動態鏈結的方式生成program可執行程式

nm program
u libtest: libtest函式為未定義,定義存在於lib.so動態函式庫檔案裡。

gcc -o program program.c ./lib.a./lib.so
通過靜態鏈結的方式生成program可執行程式

t libtest: libtest函式在text段裡,靜態鏈結的lib.a庫檔案已經鏈結加入到program二進位制可執行程式裡。

靜態鏈結 動態鏈結

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

靜態鏈結 動態鏈結

所謂靜態 動態是指鏈結。回顧一下,將乙個程式編譯成可執行程式的步驟 圖 編譯過程 靜態庫之所以成為 靜態庫 是因為在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中。因此對應的鏈結方式稱為靜態鏈結。試想一下,靜態庫與彙編生成的目標檔案一起鏈結為可執行檔案,那麼靜態庫必定跟....

靜態鏈結和動態鏈結

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