C/C++程序編譯流程

發(fā)布時(shí)間:2016-4-17 16:23    發(fā)布者:huangedu
關(guān)鍵詞: c語(yǔ)言 , C++ , 嵌入式
1.預處理
預處理相當于根據預處理指令組裝新的C/C++程序。經(jīng)過(guò)預處理,會(huì )產(chǎn)生一個(gè)沒(méi)有宏定義,沒(méi)有條件編譯指令,沒(méi)有特殊符號的輸出文件,這個(gè)文件的含義同原本的文件無(wú)異,只是內容上有所不同。
讀取C/C++源程序,對其中的偽指令(以#開(kāi)頭的指令)進(jìn)行處理
   ①將所有的“#define”刪除,并且展開(kāi)所有的宏定義
  ②處理所有的條件編譯指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。這些偽指令的引入使得程序員可以通過(guò)定義不同的宏來(lái)決定編譯程序對哪些代碼進(jìn)行處理。預編譯程序將根據有關(guān)的文件,將那些不必要的代碼過(guò)濾掉。
    ③處理“#include”預編譯指令,將被包含的文件插入到該預編譯指令的位置。
(注意:這個(gè)過(guò)程可能是遞歸進(jìn)行的,也就是說(shuō)被包含的文件可能還包含其他文件)
刪除所有的注釋
添加行號和文件名標識。
以便于編譯時(shí)編譯器產(chǎn)生調試用的行號信息及用于編譯時(shí)產(chǎn)生的編譯錯誤或警告時(shí)能夠顯示行號
保留所有的#pragma編譯器指令
2. 編譯
將預處理完的文件進(jìn)行一系列詞法分析、語(yǔ)法分析、語(yǔ)義分析及優(yōu)化后,產(chǎn)生相應的匯編代碼文件。
3. 匯編
將編譯完的匯編代碼文件翻譯成機器指令,并生成可重定位目標程序的.o文件,該文件為二進(jìn)制文件,字節編碼是機器指令。
匯編器是將匯編代碼轉變成機器可以執行的指令,每一個(gè)匯編語(yǔ)句幾乎都對應一條機器指令。所以匯編器的匯編過(guò)程相對于編譯器來(lái)講比較簡(jiǎn)單,它沒(méi)有復雜的語(yǔ)法,也沒(méi)有語(yǔ)義,也不需要做指令優(yōu)化,只是根據匯編指令和機器指令的對照表一一翻譯即可。
4. 鏈接
通過(guò)鏈接器將一個(gè)個(gè)目標文件(或許還會(huì )有庫文件)鏈接在一起生成一個(gè)完整的可執行程序。
    由匯編程序生成的目標文件并不能立即就被執行,其中可能還有許多沒(méi)有解決的問(wèn)題。
例如,某個(gè)源文件中的函數可能引用了另一個(gè)源文件中定義的某個(gè)符號(如變量或者函數調用等);在程序中可能調用了某個(gè)庫文件中的函數,等等。所有的這些問(wèn)題,都需要經(jīng)鏈接程序的處理方能得以解決。
    鏈接程序的主要工作就是將有關(guān)的目標文件彼此相連接,也就是將在一個(gè)文件中引用的符號同該符號在另外一個(gè)文件中的定義連接起來(lái),使得所有的這些目標文件成為一個(gè)能夠被操作系統裝入執行的統一整體。
至此,大致經(jīng)過(guò)這幾個(gè)步驟,一個(gè)完整的可執行程序產(chǎn)生了。
本文地址:http://selenalain.com/thread-165310-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页