當前位置:首頁 > 電腦軟件 > 調(diào)試編譯 > Gcc編譯器(Gcc For Windows)

Gcc編譯器(Gcc For Windows)

大小:12.43M 語言:簡體中文 類別:調(diào)試編譯
  • 類型:國產(chǎn)軟件
  • 授權(quán):免費軟件
  • 更新:2023-11-11
  • 標簽: c語言編譯器
  • 環(huán)境:Windows11,Windows10,Windows8,Windows7
  • 本地下載
9
0% 0%

情介紹

Gcc編譯器是GNU開發(fā)的編程語言編譯器,由GPL許可證所發(fā)現(xiàn)的自由軟件。它可處理多種編程語言,如C語言、Fortran、Pascal、Objective-C、Java和Ada以及各類處理器架構(gòu)上的匯編語言等。Gcc編譯器的外部接口類似一個標準的Unix編譯器,用戶可在命令列下鍵入Gcc之程序名,以及一些命令參數(shù),以此可方便用戶決定每個輸入檔案使用的個別語言編譯器,并為輸出程序碼使用適合此硬件平臺的組合語言編譯器,并且選擇性地執(zhí)行連接器以制造可執(zhí)行的程序。在Gcc編譯器中每個語言編譯器都是獨立程序,而這些程序可處理輸入的原始碼,并輸出組合語言碼。同時全部的語言編譯器都擁有共通的中介架構(gòu):一個前端解析符合此語言的原始碼,并產(chǎn)生一抽象語法樹,以及一翻譯此語法樹成為GCC的暫存器轉(zhuǎn)換語言〈RTL〉的后端。Gcc編譯器的接口主要分為前端接口、中介接口和后端接口,每個接口都為用戶提供不同的功能。其中前端接口主要是用于產(chǎn)生一個可讓后端處理之語法樹,而中介接口主要有消解死碼、消解重復運算與全域數(shù)值重編碼等功能。
gcc編譯器官方下載

gcc編譯器安裝教程

一、安裝了MinGW,在其根目錄下的bin文件夾中發(fā)現(xiàn)有等文件。為了測試,在該文件夾中新建了一個test.bat文件,將其中內(nèi)容寫為:gcc test.cpp
二、在該文件夾中創(chuàng)建test.cpp文件并將其內(nèi)容設(shè)置為:
1.雙擊test.bat文件,發(fā)現(xiàn)該文件夾中產(chǎn)生了一個a.exe文件,執(zhí)行該exe文件,發(fā)現(xiàn)其與預期編譯效果一致,說明編譯成功。gcc –o name test.cpp
2.可以生成名為name.exe的可執(zhí)行程序
3.把指令改為gcc –e test.cpp >test.txt 后,提示錯誤gcc: no input files
4.而把參數(shù)E改為大寫之后問題即解決:gcc –E test.cpp > test.txt

Gcc編譯器電腦版使用方法

一、Gcc編譯器常用選項
1.編譯選項
gcc有超過100個的編譯選項可用。具體的可以使用命令man gcc察看
2.優(yōu)化選項
用GCC編譯C/C++代碼時,它會試著用最少的時間完成編譯并且編譯后的代碼易于調(diào)試。易于調(diào)試意味著編譯后的代碼與源代碼有同樣的執(zhí)行順序,編譯后的代碼沒有經(jīng)過優(yōu)化。有很多的選項可以告訴GCC在耗費更多編譯時間和犧牲易調(diào)試性的基礎(chǔ)上產(chǎn)生更小更快的可執(zhí)行文件。這些選項中最典型的就是-O和-O2。-O選項告訴gcc對源代碼進行基本優(yōu)化。-O2選項告訴GCC產(chǎn)生盡可能小的和盡可能快的代碼。還有一些很特殊的選項可以通過man gcc察看
3.調(diào)試和剖析選項
GCC支持數(shù)種調(diào)試剖析選項。在這些選項中最常用的是-g和-pg.-g選項告訴gcc產(chǎn)生能被GNU調(diào)試器(如gdb)使用的調(diào)試信息,以便調(diào)試用戶的程序。-pg選項告訴gcc在用戶的程序中加入額外的代碼,執(zhí)行時,產(chǎn)生gprof用的剖析信息以顯示程序的耗時情況
二、使用GDB方法
1.在命令行中鍵入gdb并按回車就可以運行g(shù)db了,啟動gdb后,能在命令行上制定很多的選項,也可以下面的方式來運行g(shù)db: gdb filename 用這種方式運行g(shù)db時,能直接指定想要調(diào)試的程序。在命令行上健入gdb -h得到一個有關(guān)gdb的選項的說明簡單列表
2.編譯代碼以供調(diào)試,為了使gdb工作,必須使程序在編譯時包含調(diào)試信息,調(diào)試信息包含程序里的每個變量的類型,在可執(zhí)行文件里的地址映射以及源代碼的行號。gdb利用這些信息使源代碼和機器碼相關(guān)聯(lián)
三、內(nèi)容錯誤查找
1.運行 gdb bugging 命令,裝入 bugging 可執(zhí)行文件
2.執(zhí)行裝入的 bugging 命令
3.使用 where 命令查看程序出錯的地方
4.利用 list 命令查看調(diào)用 gets 函數(shù)附近的代碼
5.唯一能夠?qū)е?gets 函數(shù)出錯的因素就是變量string,用print命令查看string的值
6.在 gdb 中,我們可以直接修改變量的值,只要將 string 取一個合法的指針值就可以了,為此,我們在第11行處設(shè)置斷
7.程序重新運行到第11行處停止,這時,我們可以用 set variable 命令修改 string 的取值
8.然后繼續(xù)運行,將看到正確的程序運行結(jié)果

使用示例

一、示例代碼
int main(void)
{printf("hello\n")
 return 0
二、預編譯過程
1.這個過程處理宏定義和include,并做語法檢查
2.可以看到預編譯后,代碼從6行擴展到了910行
三、編譯過程
這個階段,生成匯編代碼
四、匯編過程
1.這個階段,生成目標代碼
2.此過程生成ELF格式的目標代碼
五、鏈接過程
鏈接過程。生成可執(zhí)行代碼。鏈接分為兩種,一種是靜態(tài)鏈接,另外一種是動態(tài)鏈接。使用靜態(tài)鏈接的好處是,依賴的動態(tài)鏈接庫較少,對動態(tài)鏈接庫的版本不會很敏感,具有較好的兼容性;缺點是生成的程序比較大。使用動態(tài)鏈接的好處是,生成的程序比較小,占用較少的內(nèi)存
六、程序運行
七、以hello.c為例子,在這四個步驟中可以設(shè)置選項分別生成hello.i, hello.s, hello.o以及最終的hello文件:
hello.c: 最初的源代碼文件
hello.i: 經(jīng)過編譯預處理的源代碼
hello.s: 匯編處理后的匯編代碼
hello.o: 編譯后的目標文件,即含有最終編譯出的機器碼,但它里
面所引用的其他文件中函數(shù)的內(nèi)存位置尚未定義
hello / a.out: 最終的可執(zhí)行文件

Gcc編譯器結(jié)構(gòu)

GCC的外部接口長得像一個標準的Unix編譯器。使用者在命令列下鍵入gcc之程序名,以及一些命令參數(shù),以便決定每個輸入檔案使用的個別語言編譯器,并為輸出程序碼使用適合此硬件平臺的組合語言編譯器,并且選擇性地執(zhí)行連接器以制造可執(zhí)行的程序
每個語言編譯器都是獨立程序,此程序可處理輸入的原始碼,并輸出組合語言碼。全部的語言編譯器都擁有共通的中介架構(gòu):一個前端解析符合此語言的原始碼,并產(chǎn)生一抽象語法樹,以及一翻譯此語法樹成為GCC的暫存器轉(zhuǎn)換語言〈RTL〉的后端。編譯器最佳化與靜態(tài)程序碼解析技術(shù)(例如FORTIFY_SOURCE,一個試圖發(fā)現(xiàn)緩沖區(qū)溢位〈buffer overflow〉的編譯器)在此階段應用于程序碼上。最后,適用于此硬件架構(gòu)的組合語言程序碼以Jack Davidson與Chris Fraser發(fā)明的算法產(chǎn)出。幾乎全部的GCC都由C寫成,除了Ada前端大部分以Ada寫成
1、前端接口
前端的功能在于產(chǎn)生一個可讓后端處理之語法樹。此語法解析器是手寫之遞歸語法解析器
直到2004年,程序的語法樹結(jié)構(gòu)尚無法與欲產(chǎn)出的處理器架構(gòu)脫鉤。而語法樹的規(guī)則有時在不同的語言前端也不一樣,有些前端會提供它們特別的語法樹規(guī)則
在2005年,兩種與語言脫鉤的新型態(tài)語法樹納入GCC中。它們稱為GENERIC與GIMPLE。語法解析變成產(chǎn)生與語言相關(guān)的暫時語法樹,再將它們轉(zhuǎn)成GENERIC。之后再使用"gimplifier"技術(shù)降低GENERIC的復雜結(jié)構(gòu),成為一較簡單的靜態(tài)唯一形式(Static Single Assignment form,SSA)基礎(chǔ)的GIMPLE形式。此形式是一個與語言和處理器架構(gòu)脫鉤的全域最佳化通用語言,適用于大多數(shù)的現(xiàn)代編程語言
2、中介接口
一般編譯器作者會將語法樹的最佳化放在前端,但其實此步驟并不看語言的種類而有不同,且不需要用到語法解析器。因此GCC作者們將此步驟歸入通稱為中介階段的部分里。此類的最佳化包括消解死碼、消解重復運算與全域數(shù)值重編碼等。許多最佳化技巧也正在實作中
3、后端接口
GCC后端的行為因不同的前處理器宏和特定架構(gòu)的功能而不同,例如不同的字符尺寸、呼叫方式與大小尾序等。后端接口的前半部利用這些訊息決定其RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉(zhuǎn)換成目標架構(gòu)的格式
GCC的最佳化技巧依其釋出版本而有很大不同,但都包含了標準的最佳化算法,例如循環(huán)最佳化、執(zhí)行緒跳躍、共通程序子句消減、指令排程等等。而RTL的最佳化由于可用的情形較少,且缺乏較高階的資訊,因此相比較起來,增加的GIMPLE語法樹形式,便顯得比較不重要
后端經(jīng)由一次重讀取步驟后,利用描述目標處理器的指令集時所取得的信息,將抽象暫存器替換成處理器的真實暫存器。此階段非常復雜,因為它必須關(guān)注所有GCC可移植平臺的處理器指令集的規(guī)格與技術(shù)細節(jié)
后端的最后步驟相當公式化,僅僅將前一階段得到的匯編語言代碼藉由簡單的子例程轉(zhuǎn)換其暫存器與內(nèi)存位置成相對應的機器碼

文件類型

.c為后綴的文件,C語言源代碼文件
.a為后綴的文件,是由目標文件構(gòu)成的檔案庫文件
.C,.cc或.cxx 為后綴的文件,是C++源代碼文件且必須要經(jīng)過預處理
.h為后綴的文件,是程序所包含的頭文件
.i 為后綴的文件,是C源代碼文件且不應該對其執(zhí)行預處理
.ii為后綴的文件,是C++源代碼文件且不應該對其執(zhí)行預處理
.m為后綴的文件,是Objective-C源代碼文件
.mm為后綴的文件,是Objective-C++源代碼文件
.o為后綴的文件,是編譯后的目標文件
.s為后綴的文件,是匯編語言源代碼文件
.S為后綴的文件,是經(jīng)過預編譯的匯編語言源代碼文件

Gcc編譯器參數(shù)

在使用GCC編譯器的時候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名稱。GCC編譯器的調(diào)用參數(shù)大約有100多個,這里只介紹其中最基本、最常用的參數(shù)。具體可參考GCC Manual:
GCC最基本的用法是∶gcc [options] [filenames]其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱
-c 只編譯,不鏈接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設(shè)的可執(zhí)行文件a.out。
-g 產(chǎn)生符號調(diào)試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調(diào)試,我們就必須加入這個選項。
-O 對程序進行優(yōu)化編譯、鏈接,采用這個選項,整個源代碼會在編譯、鏈接過程中進行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、鏈接的速度就相應地要慢一些
-O2比-O更好的優(yōu)化編譯、鏈接,當然整個編譯、鏈接過程會更慢
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數(shù)。C程序中的頭文件包含兩種情況∶
A)#include
B)#include “myinc.h”
其中,A類使用尖括號(< >),B類使用雙引號(“ ”)。對于A類,預處理程序cpp在系統(tǒng)預設(shè)包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾內(nèi)搜索相應文件
-v gcc執(zhí)行時執(zhí)行的詳細過程,gcc及其相關(guān)程序的版本
-llibrary 制定編譯的時候使用的庫,例子用法gcc -lcurses hello.c使用ncurses庫編譯程序
-Ldir 制定編譯的時候,搜索庫的路徑。比如你自己的庫,可以用它制定目錄,不然編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。   
-gstabs 此選項以stabs格式聲稱調(diào)試信息,但是不包括gdb調(diào)試信息.  
-gstabs+ 此選項以stabs格式聲稱調(diào)試信息,并且包含僅供gdb使用的額外調(diào)試信息.
-ggdb 此選項將盡可能的生成gdb的可以使用的調(diào)試信息.
-static 此選項將禁止使用動態(tài)庫,所以,編譯出來的東西,一般都很大,也不需要什么 動態(tài)連接庫,就可以運行.
-share 此選項將盡量使用動態(tài)庫,所以生成文件比較小,但是需要系統(tǒng)由動態(tài)庫.
-traditional 試圖讓編譯器支持傳統(tǒng)的C語言特性
-fno-asm 此選項實現(xiàn)ansi選項的功能的一部分,它禁止將asm,inline和typeof用作
-fno-strict-prototype 只對g++起作用,使用這個選項,g++將對不帶參數(shù)的函數(shù),都認為是沒有顯式的對參數(shù)的個數(shù)和類型說明,而不是沒有參數(shù),而gcc無論是否使用這個參數(shù),都將對沒有帶參數(shù)的函數(shù),認為城沒有顯式說明的類型
-fthis-is-varialble 就是向傳統(tǒng)c++看齊,可以使用this當一般變量使用.
-fcond-mismatch 允許條件表達式的第二和第三參數(shù)類型不匹配,表達式的值將為void類型
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
這四個參數(shù)是對char類型進行設(shè)置,決定將char類型設(shè)置成unsigned char(前兩個參數(shù))或者 signed char(后兩個參數(shù))
-include file 包含某個代碼,簡單來說,就是便以某個文件,需要另一個文件的時候,就可以用它設(shè)定,功能就相當于在代碼中使用#include
例子用法:
gcc hello.c -include /root/pianopan.h
-imacros file 將file文件的宏,擴展到gcc/g++的輸入文件,宏定義本身并不出現(xiàn)在輸入文件中
-Dmacro 相當于C語言中的#define macro
-Dmacro=defn 相當于C語言中的#define macro=defn
-Umacro 相當于C語言中的#undef macro
-undef 取消對任何非標準宏的定義
-Idir 在你是用#include"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭文件,如果沒有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他回先在你所制定的目錄查找,然后再按常規(guī)的順序去找.對于#include,gcc/g++會到-I制定的目錄查找,查找不到,然后將到系統(tǒng)的缺省的頭文件目錄查找
-I- 就是取消前一個參數(shù)的功能,所以一般在-Idir之后使用
-idirafter dir 在-I的目錄里面查找失敗,講到這個目錄里面查找.
-iprefix prefix
-iwithprefix dir 一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查
-nostdinc 使編譯器不再系統(tǒng)缺省的頭文件目錄里面找頭文件,一般和-I聯(lián)合使用,明確限定頭文件的位置
-nostdin C++ 規(guī)定不在g++指定的標準路經(jīng)中搜索,但仍在其他路徑中搜索,.此選項在創(chuàng)建libg++庫使用
-C 在預處理的時候,不刪除注釋信息,一般和-E使用,有時候分析程序,用這個很方便的  
-M 生成文件關(guān)聯(lián)的信息。包含目標文件所依賴的所有源代碼,你可以用gcc -M hello.c來測試一下,很簡單。  
-MM 和上面的那個一樣,但是它將忽略由#include造成的依賴關(guān)系。  
-MD 和-M相同,但是輸出將導入到.d的文件里面
-MMD 和-MM相同,但是輸出將導入到.d的文件里面
-Wa,option 此選項傳遞option給匯編程序;如果option中間有逗號,就將option分成多個選項,然后傳遞給會匯編程序

執(zhí)行程序

1、Pre-Processing預處理
gcc  -E  hello.c  -o  hello.i //完成頭文件和宏定義的展開,生成hello.i預處理文件
2、Compiling編譯
gcc  -S  hello.i //生成匯編代碼,生成hello.s的匯編文件
3、Assembling  匯編
gcc  -c  hello.s //生成二進制目標文件,生成hello.o文件
4、Linking 鏈接
gcc  hello.o  -o  hello //鏈接相關(guān)庫,生成可執(zhí)行文件hello,沒有后綴
PS:一般生成可執(zhí)行程序,可以直接:gcc  hello.c  -o  hello

Gcc編譯器命令

在gdb提示符處鍵入help,將列出命令的分類,主要的分類有:
aliases:命令別名
breakpoints:斷點定義
data:數(shù)據(jù)查看
files:指定并查看文件
internals:維護命令
running:程序執(zhí)行
stack:調(diào)用棧查看
statu:狀態(tài)查看
tracepoints:跟蹤程序執(zhí)行
鍵入help后跟命令的分類名,可獲得該類命令的詳細清單:
break NUM 在指定的行上設(shè)置斷點
bt 顯示所有的調(diào)用棧幀。該命令可用來顯示函數(shù)的調(diào)用順序
clear 刪除設(shè)置在特定源文件、特定行上的斷點。其用法為:clear FILENAME:NUM
continue 繼續(xù)執(zhí)行正在調(diào)試的程序。該命令用在程序由于處理信號或斷點而導致停止運行時
display EXPR 每次程序停止后顯示表達式的值。表達式由程序定義的變量組成
file FILE 裝載指定的可執(zhí)行文件進行調(diào)試
help NAME 顯示指定命令的幫助信息
info break 顯示當前斷點清單,包括到達斷點處的次數(shù)等
info files 顯示被調(diào)試文件的詳細信息
info func 顯示所有的函數(shù)名稱
info local 顯示當函數(shù)中的局部變量信息
info prog 顯示被調(diào)試程序的執(zhí)行狀態(tài)
info var 顯示所有的全局和靜態(tài)變量名稱
kill 終止正被調(diào)試的程序
list 顯示源代碼段
make 在不退出 gdb 的情況下運行 make 工具
next 在不單步執(zhí)行進入其他函數(shù)的情況下,向前執(zhí)行一行源代碼
print EXPR 顯示表達式 EXPR 的值

Gcc編譯器處理器架構(gòu)

Alpha
ARM
Atmel AVR
Blackfin
H8/300
IA-32〈x86〉 與x86-64
IA-64例如:Itanium
MorphoSys 家族
Motorola 68000
Motorola 88000
MIPS
PA-RISC
PDP-11
PowerPC
System/370,System/390
SuperH
HC12
SPARC
VAX
Renesas R8C/M16C/M32C家族
A29K
ARC
C4x
CRIS
D30V
DSP16xx
FR-30
FR-V
Intel i960
IP2000
M32R
68HC11
MCORE
MMIX
MN10200
MN10300
NS32K
ROMP
Stormy16
V850
Xtensa
D10V
MicroBlaze
PDP-10
MSP430
Z8000

載地址

  • 電腦版
Gcc編譯器(Gcc For Windows)

您喜歡

c語言編譯器大全
c語言編譯器大全
學習C語言編程,離不開C語言編譯器和集成開發(fā)工具的支持。C語言編譯器是將C語言編寫的程序源文件翻譯成二進制可執(zhí)行代碼的軟件。市面上C語言編譯器有非常多,到底哪個好?小編經(jīng)過測試,著重推薦Gcc編譯器、Clang編譯器、turbo c、DevC++這些C語言編譯器。它們不僅編譯速度和效率非常高,而且支持多平臺操作,歡迎有需要的朋友下載支持!

網(wǎng)友評論

0條評論
(您的評論需要經(jīng)過審核才能顯示)