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爲後綴名的文件是可執行文件,在終端可以直接執行,如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章