天天看點

GCC編譯過程記

GCC編譯過程記

一、引言

      對于程式設計工作者來說,GCC是一個熟悉的名字,它的全稱是“GNU Compiler Collection”。GCC是一組編譯器集合,目前其支援C、C++、Objective-C、Objective-C++、Go和RBIG語言的編譯。本篇部落客要總結使用GCC進行代碼編譯的方法以及從源檔案生成可執行檔案的整個過程。

    GCC完整的編譯過程分為4個階段,分别為預處理、編譯、裝載和連結。經過完整的4部處理後,GCC會将源檔案編譯成可執行檔案進行輸出,但是很多時候,我們進行調用時并不需要每一個過程都單獨調用,可以使用組合指令來讓GCC幫我們處理完成這些工作。

二、GCC編譯的輸出參數

    由于GCC是一組編譯器集合,是以輸入的檔案字尾名決定了GCC的編譯方式,下面列出了常見的檔案字尾名對應的編譯方式:

| 檔案字尾名  | 編譯方式 |

| .c | C語言源代碼,并且需要進行預處理 |

| .i | 已經預處理完成後的C語言源代碼 |

| .ii | 已經預處理完成後的C++源代碼 |

| .m | Objective-C源代碼,并且必須進行libobjc庫的連結 |

| .mi | 已經預處理完成後的Objective-C源代碼 |

| .M或.mm | Objective-C++源代碼,并且必須進行libobjc庫的連結 |

| .mii | 已經預處理完成後的Objective-C++源代碼 |

| .h | C,C++,Objective-C的頭檔案,會被處理進預編譯頭 |

| .cc , .cp , .cxx , .cpp , .CPP , .c++ , .C | C++語言源檔案,需要進行預編譯處理 |

| .f , .for , .ftn | 已經預處理完成後的Fortran語言源檔案 |

| .F , .FOR , .fpp , .FPP , .FTN | Fortran語言源檔案,需要進行預編譯處理 |

| .go | Go語言源檔案 |

下面以一個簡單的C語言源檔案來作為示例檔案進行GCC的編譯示範,首先編寫一個簡單的C程式如下,将檔案名命名為a.c:

#include <stdio.h>
int main(int argc, char const *argv[])
{
    printf("%s\n","Hello");
    return 0;
}           

·預編譯處理

    使用 -E 參數設定GCC隻進行預編譯處理,例如對上面的a.c源檔案執行如下的GCC指令:

gcc a.c -E > a.i           

需要注意,GCC會将編譯後的内容輸出到a.i這個檔案中,執行指令後,打開a.i檔案,你會發現一個簡單的C源檔案被預處理成了500多行代碼,你可以嘗試在源檔案中添加宏定義,預處理後所有的宏定義都被直接替換了。

    使用 -S 參數設定GCC進行編譯功能,可以将預處理後的檔案編譯為彙編源代碼,例如:

gcc a.i -S > a.S           

.S為字尾名的檔案為彙編源檔案,-S編譯是進階語言向低級語言轉換的過程。

    使用 -c 參數設定GCC進行編譯,可以将彙編後的彙編源檔案編譯成機器代碼。例如:

gcc a.i -c > a.o           

.o字尾名的檔案一般我們就沒有辦法讀懂了,其是機器碼。-c編譯是程式設計語言向機器語言轉換的過程。

    除了上面提到的幾個參數外,可以使用-o參數直接生成目标檔案,這個參數會根據輸入檔案的字尾名進行處理,直接生成可執行檔案,例如:

gcc a.o -o a.out           

其實使用.c為字尾名的C語言源檔案也可以直接使用-o參數生成可執行檔案,此時GCC會聚合前面的預處理,編譯,連接配接等過程。.out為字尾名的檔案是可執行檔案,在終端可以直接執行,如下:

GCC編譯過程記

繼續閱讀