C語言學習--靜態鏈接庫和動態鏈接庫


        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)
        動態鏈接庫可以理解為將源代碼編譯成目標代碼后打成的庫。該目標代碼庫可被其他進程在執行時動態調用。動態鏈接庫在程序執行時動態進行調用和卸載。
 
        制作動態鏈接庫
        有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,有效的節省硬盤空間。
 
 
參考文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM