C/C++程式編譯流程(預先處理->編譯->彙編->連結)

來源:互聯網
上載者:User

標籤:連結器   line   庫檔案   text   根據   源檔案   目標   center   刪除   

轉自:https://www.cnblogs.com/Lynn-Zhang/p/5377024.html

C/C++程式編譯流程(預先處理->編譯->彙編->連結)


程式的基本流程

1. 預先處理

預先處理相當於根據預先處理指令組裝新的C/C++程式。經過預先處理,會產生一個沒有宏定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。

  • 讀取C/C++來源程式,對其中的偽指令(以#開頭的指令)進行處理

    ①將所有的“#define”刪除,並且展開所有的宏定義

    ②處理所有的條件編譯指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。這些偽指令的引入使得程式員可以通過定義不同的宏來決定編譯器對哪些代碼進行處理。先行編譯程式將根據有關的檔案,將那些不必要的代碼過濾掉。 

    ③處理“#include”先行編譯指令,將被包含的檔案插入到該先行編譯指令的位置。

(注意:這個過程可能是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案)

  • 刪除所有的注釋

  • 添加行號和檔案名稱標識。

    以便於編譯時間編譯器產生調試用的行號資訊及用於編譯時間產生的編譯錯誤或警告時能夠顯示行號

  • 保留所有的#pragma編譯器指令

2. 編譯

將預先處理完的檔案進行一系列詞法分析、文法分析、語義分析及最佳化後,產生相應的彙編代碼檔案。

3. 彙編

將編譯完的彙編代碼檔案翻譯成機器指令,並產生可重定位目標程式的.o檔案,該檔案為二進位檔案,位元組編碼是機器指令。

彙編器是將彙編代碼轉變成機器可以執行的指令,每一個彙編語句幾乎都對應一條機器指令。所以彙編器的彙編過程相對於編譯器來講比較簡單,它沒有複雜的文法,也沒有語義,也不需要做指令最佳化,只是根據彙編指令和機器指令的對照表一一翻譯即可。

4. 連結

通過連結器將一個個目標檔案(或許還會有庫檔案)連結在一起產生一個完整的可執行程式。

    由組譯工具產生的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。

例如,某個源檔案中的函數可能引用了另一個源檔案中定義的某個符號(如變數或者函數調用等);在程式中可能調用了某個庫檔案中的函數,等等。所有的這些問題,都需要經連結程式的處理方能得以解決。

    連結程式的主要工作就是將有關的目標檔案彼此相串連,也就是將在一個檔案中引用的符號同該符號在另外一個檔案中的定義串連起來,使得所有的這些目標檔案成為一個能夠被作業系統裝入執行的統一整體。

 

至此,大致經過這幾個步驟,一個完整的可執行程式產生了。

C/C++程式編譯流程(預先處理->編譯->彙編->連結)

聯繫我們

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