標籤:style color 使用 strong 檔案 ar 代碼 ad
1 .h檔案:
(1) .h只做聲明,編譯後不產生代碼,#include 完全等價於把 .h 檔案拷貝 到 .c 中;
(2)函數定義要放在.c中,而.h只做聲明.否則多引用幾次,就會發生函數重複定義的錯誤;
(3)C檔案是編譯器啟動並執行最小單位,每個C檔案會被編譯成一個獨立的目標檔案(二進位);——obj檔案
(4)連接器是以目標檔案為單位,它將一個或多個目標檔案進行函數與變數的重定位,產生最終的可執行檔;
tips:
(1)只有聲明沒有定義,編譯階段不會報錯;
(2).h聲明的函數必然能在編譯器搜尋路徑下找到對應的目標檔案(.c檔案編譯後的二進位檔案),此時一般為lib或dll形式?,這樣可以在提供函數使用的同時隱藏函數原始碼。
2 .lib檔案
(1)目前以lib尾碼的庫有兩種:一種為靜態連結庫(Static Library),另一種為動態串連庫(DLL,Dynamic Link Library )的匯入庫(Import Library);
(2)靜態庫是一個或者多個obj檔案的打包,所以有人乾脆把從obj檔案產生lib的過程稱為Archive,即合并到一起。比如你連結一個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子;
(3)靜態庫本身就包含了實際執行代碼、符號表等等,匯入庫的實際的執行代碼位於動態庫中,匯入庫只包含了地址符號表等,確保程式找到對應函數的一些基本地址資訊。
3 .dll檔案
(1)靜態調用(隱式調用):動態庫一般會有對應的匯入庫,方便程式靜態載入動態連結程式庫,有了匯入庫,只需要連結匯入庫後按照標頭檔函數介面的聲明調用函數就可以了;
(2)動態調用(顯式調用):使用LoadLibrary調入DLL檔案,然後再手工GetProcAddress獲得對應函數了;
(3)當程式運行時,作業系統將動態連結程式庫檔案一併載入入記憶體,並映射到程式的地址空間中,這樣就保證了程式能夠正常調用到庫檔案中的函數。同時作業系統保證當程式有多個執行個體運行時,動態連結程式庫也只有一份拷貝在記憶體中,也就是說動態連結程式庫是在運行期共用的。