轉載 明確編譯串連具體工作

來源:互聯網
上載者:User

1.標頭檔並不參加連結和編譯。編譯器第一步要做的就是簡單的把標頭檔在包含它的源檔案中展開。不知你是否能理解這句話。也就是標頭檔裡面有什麼內容,通通把它移到包含這個標頭檔的源檔案裡。(我覺得這是個很重要的概念,可以協助我們簡化理解編譯連結的過程,包括理解標頭檔中定義靜態變數或靜態函數是怎麼回事)。編譯器經過這一步轉換後剩下什麼呢?就是一堆cpp檔案了。而標頭檔已經不再是編譯器需要關心的東西了。編譯器接下來就要處理這一堆cpp檔案了。2.接著編譯器調用cl.exe編譯所有的cpp檔案並產生對應的obj檔案。每個obj裡面有很多函數,但並不是每個函數都有具體的實現代碼,有些函數的實現是在其它的obj或dll或lib裡面實現的。3.最後編譯器調用link.exe連結所有的obj並產生exe檔案。在連結obj模組時,如果發現有函數符號標識,就去其他模組尋找標識指向的函數實體。link後,所有函數在程式碼中佔據一個。而原先obj中的標識就變成指向相應函數的地址。4.要區分lib靜態庫和lib匯入庫的區別。   dll隱式串連:即程式運行時就載入動態連結程式庫,並把代碼映射到記憶體空間   dll明確式載入,當程式需要調用到某個函數時才去載入動態連結程式庫什麼是lib檔案,lib和dll的關係如何(1)lib是編譯時間需要的,dll是運行時需要的。 如果要完成原始碼的編譯,有lib就夠了。 如果也使動態串連的程式運行起來,有dll就夠了。 在開發和調試階段,當然最好都有。 (2)一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就串連到應用程式中的,而dll檔案是運行期才會被調用的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實現在dll檔案中。如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib檔案有好處:給使用者安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程式比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發布新的應用程式才行。(3)在動態庫的情況下,有兩個檔案,一個是引入庫(.LIB)檔案,一個是DLL檔案,引入庫檔案包含被DLL匯出的函數的名稱和位置,DLL包含實際的函數和資料,應用程式使用LIB檔案連結到所需要使用的DLL檔案,DLL庫中的函數和資料並不複製到可執行檔中,因此在應用程式的可執行檔中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的記憶體位址,這樣當一個或多個應用程式運行是再把程式碼和被調用的函數代碼連結起來,從而節省了記憶體資源。從上面的說明可以看出,DLL和.LIB檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.