gcc編譯時做了什麼工作
gcc編譯分為四部;
第一步,預編譯,將程序中的宏定義等預編譯;
第二步,編譯,將*.h,*.c等文件編譯成為*.o文件;
第三步,匯編;
第四步,連接,將*.o文件連接庫,生成可執行文件!
B. g++鏄浠涔
g++鏄疓NU寮鍙戠殑C++緙栬瘧鍣錛屾槸GCC錛圙NU Compiler Collection錛塆NU緙栬瘧鍣ㄥ椾歡鐨勭粍鎴愰儴鍒嗐傚彟澶栵紝gcc鏄疓NU鐨凜緙栬瘧鍣ㄣ
g++緙栬瘧鍣ㄦ槸GCC鐨勪竴閮ㄥ垎錛孏CC緙栬瘧宸ヤ綔涓鑸鍒嗕負鍥涗釜姝ラわ細
錛1錛夐勫勭悊錛圥reprocessing錛夈傜敱棰勫勭悊鍣╟pp瀹屾垚錛屽皢.cpp婧愭枃浠墮勫勭悊涓.i鏂囦歡銆
C. 請問linux下,gcc編譯程序的過程(從讀取源文件到製作可執行程序中間所有過程,越詳細越好)
gcc -S *.c 預處理+反匯編
D. Linux里gcc的執行方式是什麼,
什麼是GCC?GCC是由GNU之父Stallman所開發的linux下的編譯器,全稱為GNU Compiler Collection, 目前可以編譯的語言包括:C, C++, Objective-C, Fortran, Java, and Ada, 可以在其官方頁面找到更加詳細的信息什麼是GCC?GCC是一個原本用於Unix-like系統下編程的編譯器。不過,現在GCC也有了許多Win32下的移植版本。這要感謝Internet上眾多程序員的共同努力。GCC的歷史
GCC是GNU公社的一個項目。是一個用於編程開發的自由編譯器。最初,GCC只是一個C語言編譯器,他是GNU C Compiler 的英文縮寫。隨著眾多自由開發者的加入和GCC自身的發展,如今的GCC以經是一個包含眾多語言的編譯器了。其中包括 C,C++,Ada,Object C和Java等。所以,GCC也由原來的GNU C Compiler變為GNU Compiler Collection。也就是 GNU編譯器家族 的意思。當然,如今的GCC藉助於他的特性,具有了交叉編譯器的功能,即在一個平台下編譯另一個平台的代碼。
直到現在,GCC的歷史仍然在繼續,他的傳奇仍然被人所傳頌。GCC有什麼作用?Linux系統下的Gcc(GNU C Compiler)是GNU推出的功能強大、性能優越的多平台編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平台上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。GCC有什麼作用?Gcc編譯器能將C、C++語言源程序、匯程式化序和目標程序編譯、連接成可執行文件,如果沒有給出可執行文件的名字,gcc將生成一個名為a.out的文件。在Linux系統中,可執行文件沒有統一的後綴,系統從文件的屬性來區分可執行文件和不可執行文件。而gcc則通過後綴來區別輸入文件的類別,下面我們來介紹gcc所遵循的部分約定規則。
.c為後綴的文件,C語言源代碼文件;
.a為後綴的文件,是由目標文件構成的檔案庫文件;
.C,.cc或.cxx 為後綴的文件,是C++源代碼文件;
.h為後綴的文件,是程序所包含的頭文件;
.i 為後綴的文件,是已經預處理過的C源代碼文件;
.ii為後綴的文件,是已經預處理過的C++源代碼文件;
.m為後綴的文件,是Objective-C源代碼文件;
.o為後綴的文件,是編譯後的目標文件;
.s為後綴的文件,是匯編語言源代碼文件;
.S為後綴的文件,是經過預編譯的匯編語言源代碼文件。GCC有什麼作用?Gcc的執行過程
雖然我們稱Gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執行文件的過程不僅僅是編譯的過程,而是要經歷四個相互關聯的步驟∶預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。
命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調用cc1進行編譯,這個階段根據輸入文件生成以.o為後綴的目標文件。匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為後綴的匯編語言源代碼文件和匯編、.s為後綴的匯編語言文件經過預編譯和匯編之後都生成以.o為後綴的目標文件。當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。GCC有什麼作用?Gcc的基本用法和選項
在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。Gcc編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。
Gcc最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。
-O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶
A)#include
B)#include 「myinc.h」
其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件
E. 理解GCC編譯流程 - Hello World
c 說明
c++ 說明
gcc 說明
原文參考 http://www.gainstart.cn
本文主要介紹和記錄gcc編譯流程及原理。過多的概念和名詞這里就不做解釋。主要還是說明gcc的編譯原理。
首先我們先准備 helloworld.c 源碼文件,內容如下
使用 gcc helloworld.c 命令 默認在當前目錄下生成 a.out 執行文件,這時我們可以使用命令 ./a.out 執握裂旅行此文件
gcc 編段凳譯過程分為 預處理(預處理文件.i) -> 編譯(匯編文件.s) -> 匯編(目標文件.o) -> 鏈接(可執行文件.exe | a.out)
gcc首先會做預處理,並生成預處理文件,文件後綴名為 .i 。
以下列出預處理會做的事情(當然預處理做的事不止這些)。
編譯是把預處理文件編譯成匯編語言,文源源件後綴名為 .s 。
使用 -S 生成匯編文件,如下
匯編內容如圖
匯編過程是將匯編文件編譯成二進制文件,文件後綴為 .o
使用 -c 可以生成二進制文件,如下:
鏈接過程是將二進制文件鏈接成可執行文件。
編譯時不用加任何參數,如下:
F. gcc編譯器在編譯過程會進行哪些檢查
一個編譯器,執行的時候
先會做詞法分析,其中會判斷是否符合詞法規范,一般用有限自動機寫
然後是語法分析,自頂向下的LL和自底向上的LR,會判斷是否符合文法規范
然後就是四元式,語義動作、匯編指令,後面的檢查應該就不多了
G. 什麼是GCCGCC有什麼作用
GCC(GNUCompilerCollection,GNU編譯器套件),是由GNU開發的編程語言編譯器。它是以GPL許可證所發行的自由軟體,也是GNU計劃的關鍵部分。
GCC原本作為GNU操作系統的官方編譯器,現已被大多數類Unix操作系統(如Linux、BSD、MacOSX等)採納為標準的編譯器,GCC同樣適用於微軟的Windows。GCC是自由軟體過程發展中的著名例子,由自由軟體基金會以GPL協議發布。
GCC功能與作用:
1、預處理
命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。
2、編譯
用GCC編譯C/C++代碼時,它會試著用最少的時間完成編譯並且編譯後的代碼易於調試。易於調試意味著編譯後的代碼與源代碼有同樣的執行順序,編譯後的代碼沒有經過優化。
3、連接
當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。
4、匯編
匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為後綴的匯編語言源代碼文件和匯編、.s為後綴的匯編語言文件經過預編譯和匯編之後都生成以.o為後綴的目標文件。
(7)gcc編譯時做了什麼工作擴展閱讀:
gcc所遵循的部分約定規則:
1、.c為後綴的文件,C語言源代碼文件。
2、.a為後綴的文件,賣散是洞慶由目標文件構成的檔案庫文件。
3、.h為後綴的文件,是程序所包含的頭文件。
4、.i為後綴的文件,是C源代碼文件且不應該對其執行預處理。
5、.m為後綴的文件,是Objective-C源代碼文件。
6、.o為後綴的文件,是編譯後的目標文件。
7、.s為後綴的文件,是匯編語言源代碼文件。
H. C語言程序編譯後產生哪些類型的文件這些文件的作用是什麼
不同的系統,產生的文件不一樣;
win:
->.obj目標文件
->.obj目標文件->.exe可執行文件
->.rc
。。。。
I. 透過源碼領悟GCC到底在幹些什麼 GCC源碼分析
上半年一直在做有關GCC和LD的項目,到現在還沒做完。最近幾天編程的那台電腦壞了,所以趁此間隙寫一點相關的分析和經驗之類的跟大家共享。
一、GCC的作用和運行機制
GCC是Linux下重要的編譯工具,用法這里就不說了,滿大街都找得到。這里我重點介紹GCC的運作機制,作為代碼分析的鋪墊。全篇使用C語言子部件來作分析,因為我對其他語言的編譯沒有研究。
根據編譯原理,語言的編譯分為這么幾個步驟:詞法分析、語法分析、語義分析、中間語言生成、優化、目標代碼生成等。然而從編譯器使用的角度來看,要把源代碼翻譯為可執行文件要經過編譯和連接兩步,與此對應,一塌帆個完整的編譯系統一定包含編譯器和連接器兩大功能部件。編譯器要完成編譯原悶塵理中提到的那些任務;連接器要把編譯器生成的代碼片段拼接成一個完整的可執行程序。之所以需要連接器,是因為一般的程序都是多源文件的,而編譯器一次只編譯一個源文件(稱之為翻譯單元translation unit),因此需要連接器把所有翻譯單元對應的輸出合並成一個可執行文件。
如果一切順利,可執行程序就可以正確的生成出來。但是一旦源代碼存在某些問題,錯誤就會被報告出來。編譯器報告的錯誤一般都是局部錯誤,它會指明錯誤在哪個文件第幾行;連接器報告的錯誤一般都是全局錯誤,而且絕大多數都是多胳膊少腿的問題,比如函數重定義,無法解決的外部符號等,這些錯誤無法定位到某一行。
GCC就是這里的編譯器。准確來說,GCC是一個編譯驅動器,驅動cc1、as和ld三個部件完成編譯、匯編和連接的工作。cc1將C語言源文件編譯為匯編文件(.s)。而將匯編代碼轉換為二進制指令的工作由AS完成,生成大家都很熟悉的對象文件(.o);生成的這些對象文件再由AR程序打包成靜態庫(.a),或者由LD程序連接成可執行程序(elf、.so或其他格式)。而LD就是所謂的連接器。AS、AR、LD是屬於另外一個叫做binutils的軟體包的程序,所以要讓GCC能夠有效運作起來,除了在系統中安裝GCC外,還要安裝binutils才行。
以下是cc1、as、ld各司其責的配合完成一個編譯過程。
[plain] view plain
gcc test.c -S -o test.S
as test.S -o test.o
ld test.o -o test
通常所用的「gcc -c」就相當於「gcc -S」 + as,而對於編譯單個源文件一步到位生成可執行「gcc test.c -o test」相當於上面三個步驟的組合,中間文件被放置在臨時目錄下。從這一點看來,GCC除去編譯的功能外,更像是個driver,它可以驅動as和ld完成整個的編譯,特別是gcc也接受對象文件(.o)和靜態庫(.a)作為參數用於生成可執行程序,其實背後就是調用的LD,還可以用「-Wl,」選項給LD傳遞自定義參數。所以在大多數軟體的Makefile里,你很難找到AS和LD的字眼,gcc已經給你包辦了。
GCC源代碼里包含的主要就是cc1這部分(還包括一些其他的輔助工具,比如collect2等)。
二、GCC的安裝
要學習和修改GCC源碼,首先第一步是在自己的機器上用GCC源代碼編譯出一個選定版本的GCC(這里以gcc-4.5.2.tar.bz2為例,源碼可以從http://gcc.gnu.org去下載)。除此之外,GCC依賴於gmp、mpfr、mpc三個庫,如果你機器上沒有,或者版本太團罩雹老以至於無法支持新的GCC,那麼你還得去把這三個庫下載下來。
一般來說,下載GCC是從GNU的FTP鏡像網站去下載,gcc的代碼包一般放置在/release/gcc-x.y目錄下,而那三個依賴庫一般放置在/infrastructure/目錄下。
1、把依賴庫和GCC解包
[plain] view plain
tar -vjxf gmp-4.3.2.tar.bz2 -C /usr/src/
tar -vjxf mpfr-2.4.2.tar.bz2 -C /usr/src/
tar -vxf mpc-0.8.1.tar.gz -C /usr/src/
tar -vjxf gcc-4.5.2.tar.bz2 -C /usr/src/
2、到自己的home目錄下編譯依賴庫
[plain] view plain
cd ~
mkdir gmp-build
cd gmp-build
/usr/src/gmp-4.3.2/configure --prefix=/usr/local/gmp-4.3.2 #指定安裝位置
make
make check
make install
cd ~
mkdir mpfr-build
cd mpfr-build
/usr/src/mpfr-2.4.2/configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
make
make check
make install
cd ~
mkdir mpc-build
cd mpfr-build
/usr/src/mpc-0.8.1/configure --prefix=/usr/local/mpc-0.8.1 --with-mpfr=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
make
make check
make install
3、編譯GCC
[plain] view plain
cd ~
mkdir gcc-build
cd gcc-build
/usr/src/gcc-4.5.2/configure --prefix=/usr/local/gcc-4.5.2 --with-mpc=/usr/local/mpc-0.8.1 --with-mpfr=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2 --enable-languages=c,c++
make
make install