C語言學習 靜態鏈結庫和動態鏈結庫

2022-06-22 18:12:12 字數 1268 閱讀 6432

c寫的**最終要想變成可執行檔案,需要經過編譯鏈結。

在windows上,.c檔案進過編譯生成目標檔案.obj,再將目標檔案鏈結生成.exe。

對於大型專案,會把程式劃分成幾個獨立的模組,然後每個模組分別編譯,在編譯之後,由聯結器把這些獨立的片段「粘接到一起」。

採用靜態鏈結庫,lib中的指令都被直接包含在最終生成的exe檔案中。

製作靜態鏈結庫

有lib.h和lib.cpp兩個檔案,編譯這個工程得到libtest.lib檔案。這個檔案就是乙個函式庫。將lib.h和libtest.lib提交給使用者後,使用者就能使用這個模組內的函式了。

使用libtest.lib有兩種方式:

1.將lib.h和libtest.lib拷貝到工程子目錄下。在要使用的.c檔案中,加上lib.h標頭檔案引用,加上#pragma comment(lib, 「libtest.lib」)。這樣就可以呼叫靜態鏈結庫。這句**的意思是指本檔案生成的.obj檔案應該和libtest.lib一起鏈結。

2.在vs工程中,填入庫檔案libtest.lib路徑。也是可行的。

庫不能單獨執行

庫提供一些可以給別的程式呼叫的內容,別的程式要呼叫它必須以某種方式指明它要呼叫。

動態鏈結庫可以理解為將源**編譯成目標**後打成的庫。該目標**庫可被其他程序在執行時動態呼叫。動態鏈結庫在程式執行時動態進行呼叫和解除安裝。

製作動態鏈結庫

有dll.h和dll.cpp兩個檔案,編譯生成 dlltest.dll 和 dlltest.lib。

動態庫呼叫:

1.將.dll和.lib拷貝到要使用的目錄下,然後在.cpp檔案中加上#pragma comment(lib, 「dlltest.lib」),然後通過extern 宣告引用dll.cpp中的函式。接著編譯、鏈結、執行就會得到結果。對於動態鏈結庫,鏈結的時候需要.lib檔案,執行的時候需要.dll檔案。

2.在工程中使用loadlibrary動態的載入dll。

靜態庫對應的.lib檔案叫靜態庫,本身包含了實際執行**、符號表等等。當生成可執行檔案以後,可執行檔案包含所有的**,因此,在可執行檔案執行時就不再需要靜態庫。但是這樣最後的程式占用磁碟空間較大。如果有多個程序在記憶體中執行,記憶體中就存有多份相同的庫函式**,因此占用記憶體空間較多。

動態庫對應的.lib檔案叫導入庫,實際的執行**位於動態庫中,導入庫只包含了位址符號表,確保程式找到對應函式的一些基本位址資訊。最終的可執行檔案不包含dll中的內容,只是通過導入庫(.lib)知道了相應的位址資訊,因此,可執行檔案在執行時動態得去載入dll。多個應用程式可以同時使用乙個dll,有效的節省硬碟空間。

C 靜態鏈結庫和動態鏈結庫

專案 屬性 c c 附加包含目錄 填寫附加標頭檔案所在目錄 分號間隔多項 專案 屬性 鏈結器 常規 附加庫目錄 填寫附加依賴庫所在目錄 分號間隔多項 專案 屬性 鏈結器 輸入 附加依賴項 填寫附加依賴庫的名字.lib 空格或分號間隔多項 2 dynamic link library 的縮寫形式,dl...

C語言使用動態鏈結庫靜態鏈結庫

1 每個 c 語言原始檔被編譯後生成目標檔案,這些目標檔案最終要被鏈結在一起生成可執 行檔案。2 鏈結器的主要作用是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正 確的銜接。由鏈結器在鏈結時將庫的內容直接加入到可執行程式中 編譯靜態庫原始碼 gcc c lib.c o lib.o 生成靜...

C語言使用動態鏈結庫靜態鏈結庫

1 每個 c 語言原始檔被編譯後生成目標檔案,這些目標檔案最終要被鏈結在一起生成可執 行檔案。2 鏈結器的主要作用是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正 確的銜接。由鏈結器在鏈結時將庫的內容直接加入到可執行程式中 編譯靜態庫原始碼 gcc c lib.c o lib.o 生成靜...