關於.h,.lib,.dll檔案

來源:互聯網
上載者:User

標籤: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)當程式運行時,作業系統將動態連結程式庫檔案一併載入入記憶體,並映射到程式的地址空間中,這樣就保證了程式能夠正常調用到庫檔案中的函數。同時作業系統保證當程式有多個執行個體運行時,動態連結程式庫也只有一份拷貝在記憶體中,也就是說動態連結程式庫是在運行期共用的。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.