編譯過程主要分為
4個過程
1) 編譯預處理
預編譯程式完成的工作,可以說成是對源程式的「替換」工作。經過這個過程,生成乙個沒有巨集定義、沒有條件編譯指令、沒有特殊符號的輸出檔案。
2) 編譯、優化階段:
通過詞法分析、語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間**或彙編**。
在c++中,以下函式如果你沒有定義但是被需要時,編譯器會產生他們:預設建構函式、拷貝建構函式、析構函式、賦值運算子和一對取址運算子。
3) 彙編過程:
把組合語言**翻譯成目標機器指令的過程。對於被翻譯系統處理的每乙個
c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。
4) 將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠誒作業系統裝入執行的統一整體
。c++使用鏈結器以確保用到的函式都只被定義一次,以及確保static objects只被定義一次,會將我們做了宣告但卻未曾定義的函式檢測出來。
鏈結有靜態鏈結和動態鏈結。
這樣該程式在被執行時這些**將被裝入到該程序的虛擬位址空間中。靜態鏈結庫實際上是乙個目標檔案的集合,
其中的每個檔案含有庫中的乙個或者一組相關函式的**。
在此種方式下,函式的**被放到稱作是動態鏈結庫或共享物件的某個目標檔案中。
鏈結程式此時所作的只是在最終的可執行程式中記錄下共享物件的名字以及其它少量
的登記資訊。在此可執行檔案被執行時,動態鏈結庫的全部內容將被對映到執行時相應
備註:標頭檔案裡我們通常只放置宣告而不是定義,因為標頭檔案有可能被釋放到多個原始檔中,每個原始檔都會單獨編譯
,這樣鏈結
時就會發現全域性空間中有多個定義了。
c編譯過程
編譯的概念 編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。編譯的完整過程 c源程式 預編譯處理 c 編譯 優化程式 s asm 匯程式設計序 obj o a ko 鏈...
C 編譯過程
以helloword.c 程式說明編譯過程 在預設的狀態下,如果我們直接以gcc編譯原始碼,並且沒有加上任何引數,則執行檔案的檔名會被自動設定為a.out 這個檔名。所以你就能夠直接執行 a.out這個這行檔案。hello.c 就是原始碼,gcc是編譯程式,a.out 是編譯成功的可執行檔案。如果我...
c 編譯過程
用c 編譯源 檔案分為四個步驟。例如,如果您有乙個命名的c 源 檔案prog1.cpp,則執行compile命令 g wall std c 11 o prog1 prog1.cpp 編譯過程如下所示 c 預處理器將包含的標頭檔案的內容複製到源 檔案中,生成巨集 並替換使用 define它們的值定義的...