<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Linux下C編程基礎(chǔ)之:gcc編譯器

          Linux下C編程基礎(chǔ)之:gcc編譯器

          作者: 時間:2013-09-13 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/257151.htm

          3.3

          GNUCC(簡稱為gcc)是GNU項目中符合ANSIC標準的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語言編寫的程序。gcc不僅功能強大,而且可以編譯如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多種語言,而且gcc是一個交叉平臺編譯器,它能夠在當前CPU平臺上為多種不同體系結(jié)構(gòu)的硬件平臺開發(fā)軟件,因此尤其適合在嵌入式領(lǐng)域的開發(fā)編譯。本章中的示例,除非特別注明,否則均采用4.x.x的gcc版本。

          表3.6所示為gcc支持編譯源文件的后綴及其解釋。

          表3.6 gcc所支持后綴名解釋

          后綴名

          所對應(yīng)的語言

          后綴名

          所對應(yīng)的語言

          .c

          C原始程序

          .s/.S

          匯編語言原始程序

          .C/.cc/.cxx

          C++原始程序

          .h

          預處理文件(頭文件)

          .m

          Objective-C原始程序

          .o

          目標文件

          .i

          已經(jīng)過預處理的C原始程序

          .a/.so

          編譯后的庫文件

          .ii

          已經(jīng)過預處理的C++原始程序

          3.3.1gcc編譯流程解析

          如本章開頭提到的,gcc的編譯流程分為了4個步驟,分別為:

          n 預處理(Pre-Processing);

          n 編譯(Compiling);

          n 匯編(Assembling);

          n 鏈接(Linking)。

          下面就具體來查看一下gcc是如何完成以上4個步驟的。

          首先看一下hello.c的源代碼:

          #includestdio.h>

          intmain()

          {

          printf(Hello!Thisisourembeddedworld!n);

          return0;

          }

          (1)預處理階段。

          在該階段,對包含的頭文件(#include)和宏定義(#define、#ifdef等)進行處理。在上述代碼的預處理過程中,編譯器將包含的頭文件stdio.h編譯進來,并且用戶可以使用gcc的選項“-E”進行查看,該選項的作用是讓gcc在預處理結(jié)束后停止編譯過程。

          注意

          gcc指令的一般格式為:gcc[選項]要編譯的文件[選項][目標文件]

          其中,目標文件可缺省,gcc默認生成可執(zhí)行的文件,名為:編譯文件.out

          [root@localhostgcc]#gcc–Ehello.c–ohello.i

          在此處,選項“-o”是指目標文件,由表3.6可知,“.i”文件為已經(jīng)過預處理的C程序。以下列出了hello.i文件的部分內(nèi)容:

          typedefint(*__gconv_trans_fct)(struct__gconv_step*,

          struct__gconv_step_data*,void*,

          __constunsignedchar*,

          __constunsignedchar**,

          __constunsignedchar*,unsignedchar**,

          size_t*);

          #2hello.c2

          intmain()

          {

          printf(Hello!Thisisourembeddedworld!n);

          return0;

          }

          由此可見,gcc確實進行了預處理,它把“stdio.h”的內(nèi)容插入hello.i文件中。

          (2)編譯階段。

          接下來進行的是編譯階段,在這個階段中,gcc首先要檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼實際要做的工作,在檢查無誤后,gcc把代碼翻譯成匯編語言。用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,結(jié)果生成匯編代碼。

          [root@localhostgcc]#gcc–Shello.i–ohello.s

          以下列出了hello.s的內(nèi)容,可見gcc已經(jīng)將其轉(zhuǎn)化為匯編代碼了,感興趣的讀者可以分析一下這一個簡單的C語言小程序是如何用匯編代碼實現(xiàn)的。

          .filehello.c

          .section.rodata

          .align4

          .LC0:

          .stringHello!Thisisourembeddedworld!

          .text

          .globlmain

          .typemain,@function

          main:

          pushl%ebp

          movl%esp,%ebp

          subl$8,%esp

          andl$-16,%esp

          movl$0,%eax

          addl$15,%eax

          addl$15,%eax

          shrl$4,%eax

          sall$4,%eax

          subl%eax,%esp

          subl$12,%esp

          pushl$.LC0

          callputs

          addl$16,%esp

          movl$0,%eax

          leave

          ret

          .sizemain,.-main

          .identGCC:(GNU)4.0.0200XYZ19(RedHat4.0.0-8)

          .section.note.GNU-stack,,@progbits

          (3)匯編階段。

          匯編階段是把編譯階段生成的“.s”文件轉(zhuǎn)成目標文件,讀者在此使用選項“-c”就可看到匯編代碼已轉(zhuǎn)化為“.o”的二進制目標代碼了,如下所示:

          [root@localhostgcc]#gcc–chello.s–ohello.o

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程


          c++相關(guān)文章:c++教程



          上一頁 1 2 3 4 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();