?? gcc編譯步驟介紹.htm
字號:
<p>通常所說的GCC是GUN Compiler Collection的簡稱,除了編譯程序之外,它還含其他相關工具,所以它能把易于人類使用的高級語言編寫的源代碼構建成計算機能夠直接執行的二進制代碼。GCC是Linux平臺下最常用的編譯程序,它是Linux平臺編譯器的事實標準。同時,在Linux平臺下的嵌入式開發領域,GCC也是用得最普遍的一種編譯器。GCC之所以被廣泛采用,是因為它能支持各種不同的目標體系結構。例如,它既支持基于宿主的開發(簡單講就是要為某平臺編譯程序,就在該平臺上編譯),也支持交叉編譯(即在A平臺上編譯的程序是供平臺B使用的)。目前,GCC支持的體系結構有四十余種,常見的有X86系列、Arm、PowerPC等。同時,GCC還能運行在不同的操作系統上,如Linux、Solaris、Windows等。</p>
<p>除了上面講的之外,GCC除了支持C語言外,還支持多種其他語言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。</p>
<p>本系列文章中,我們不僅介紹GCC的基本功能,還涉及到一些諸如優化之類的高級功能。另外,我們還考察GCC的一些映像操作工具,如size和objcopy等,這將在后續的文章中加以介紹。</p>
<p><STRONG>二、程序的編譯過程</STRONG></p>
<p>對于GUN編譯器來說,程序的編譯要經歷預處理、編譯、匯編、連接四個階段,如下圖所示:</p>
<p><IMG height=303 alt="" src="http://tech.NKZU.com/Programme/BCimages/200612/2006121525011904.jpg" width=152 border=0> </p>
<p>從功能上分,預處理、編譯、匯編是三個不同的階段,但GCC的實際操作上,它可以把這三個步驟合并為一個步驟來執行。下面我們以C語言為例來談一下不同階段的輸入和輸出情況。</p>
<p>在預處理階段,輸入的是C語言的源文件,通常為*.c。它們通常帶有.h之類頭文件的包含文件。這個階段主要處理源文件中的#ifdef、 #include和#define命令。該階段會生成一個中間文件*.i,但實際工作中通常不用專門生成這種文件,因為基本上用不到;若非要生成這種文件不可,可以利用下面的示例命令:</p>
<p>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><p>gcc -E test.c -o test.i</p></PRE></TD></TR></TBODY></TABLE></p>
<p>在編譯階段,輸入的是中間文件*.i,編譯后生成匯編語言文件*.s 。這個階段對應的GCC命令如下所示:</p>
<p>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><p>GCC -S test.i -o test.s </p></PRE></TD></TR></TBODY></TABLE></p>
<p>在匯編階段,將輸入的匯編文件*.s轉換成機器語言*.o。這個階段對應的GCC命令如下所示:</p>
<p>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><p>GCC -c test.s -o test.o </p></PRE></TD></TR></TBODY></TABLE></p>
<p>最后,在連接階段將輸入的機器代碼文件*.s(與其它的機器代碼文件和庫文件)匯集成一個可執行的二進制代碼文件。這一步驟,可以利用下面的示例命令完成:</p>
<p>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><p>GCC test.o -o test </p></PRE></TD></TR></TBODY></TABLE></p>
<p>上面介紹了GCC編譯過程的四個階段以及相應的命令。下面我們進一步介紹常用的GCC的模式。</p>
<p><STRONG>三、GCC常用模式</STRONG></p>
<p>這里介紹GCC追常用的兩種模式:編譯模式和編譯連接模式。下面以一個例子來說明各種模式的使用方法。為簡單起見,假設我們全部的源代碼都在一個文件test.c中,要想把這個源文件直接編譯成可執行程序,可以使用以下命令:</p>
<p>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><p>$ GCC -o test</p></PRE></TD></TR></TBODY></TABLE></p>
<p>這里test.c是源文件,生成的可執行代碼存放在一個名為test 的文件中(該文件是機器代碼并且可執行)。-o 是生成可執行文件的輸出選項。如果我們只想讓源文件生成目標文件(給文件雖然也是機器代碼但不可執行),可以使用標記-c ,詳細命令如下所示:</p>
<p>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><p>$ GCC -c test.c</p></PRE></TD></TR></TBODY></TABLE></p>
<p>默認情況下,生成的目標文件被命名為test.o,但我們也可以為輸出文件指定名稱,如下所示:</p>
<p>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><p>$ GCC -c test.c -o </p></PRE></TD></TR></TBODY></TABLE></p>
<p>上面這條命令將編譯后的目標文件命名為mytest.o,而不是默認的test.o。</p>
<p>迄今為止,我們談論的程序僅涉及到一個源文件;現實中,一個程序的源代碼通常包含在多個源文件之中,這該怎么辦?沒關系,即使這樣,用GCC處理起來也并不復雜,見下例:</p>
<p><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><p>$ GCC -o test first.c second.c third.c</p></PRE></TD></TR></TBODY></TABLE></p>
<p>該命令將同時編譯三個源文件,即first.c、second.c和 third.c,然后將它們連接成一個可執行程序,名為test。</p>
<p><br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -