GCC是一種廣泛使用的編譯器集合,其中包括C,C ++,Objective-C,F(xiàn)ortran,Ada和其他語(yǔ)言的編譯器。它最初由理查德·斯托曼(Richard Stallman)開(kāi)發(fā),是自由軟件基金會(huì)(FSF)的一個(gè)項(xiàng)目。GCC具有許多功能,例如優(yōu)化代碼生成,多個(gè)平臺(tái)支持,多語(yǔ)言支持,自動(dòng)向量化和調(diào)試支持。它是許多操作系統(tǒng)和軟件的標(biāo)準(zhǔn)編譯器,包括Linux,Unix,F(xiàn)reeBSD等。使用GCC編譯器可以生成目標(biāo)代碼,靜態(tài)鏈接庫(kù)和共享對(duì)象,還可以執(zhí)行代碼分析和優(yōu)化。它還提供了許多命令行選項(xiàng)和編譯器插件來(lái)滿足多樣化的編譯要求。GCC編譯器是一種功能強(qiáng)大且廣泛使用的編譯器,可用于多種語(yǔ)言和平臺(tái)。
GCC 包括以下語(yǔ)言的編譯器
- C: 用于編寫(xiě)系統(tǒng)級(jí)程序,驅(qū)動(dòng)程序等。
- C++: 用于編寫(xiě)面向?qū)ο蟮某绦颍缱烂鎽?yīng)用程序,游戲等。
- Objective-C: 用于編寫(xiě) MacOS 和 iOS 中的應(yīng)用程序。
- Fortran: 用于編寫(xiě)科學(xué)計(jì)算應(yīng)用程序。
- Ada: 用于編寫(xiě)高可靠性的應(yīng)用程序。
- D: 用于編寫(xiě)高性能的系統(tǒng)應(yīng)用程序。
- Go: 用于編寫(xiě)并發(fā)應(yīng)用程序。
- OpenMP: 用于基于內(nèi)核的并行編程。
GCC 還支持許多不同的目標(biāo)平臺(tái),包括 Linux、Windows、Mac OS X、Unix 等。
Gcc編譯器特點(diǎn)
- 字節(jié)碼: 可以將程序編譯為字節(jié)碼并在不同系統(tǒng)上運(yùn)行。 - 全平臺(tái): 可以在多個(gè)系統(tǒng)上使用,包括 Blackfin、IBM、SPARC、PowerPC 等。 - 模塊化: 可以方便地添加新模塊來(lái)擴(kuò)展 GCC 的能力。 - 開(kāi)放源代碼: 可以方便地進(jìn)行修改和分發(fā)。
總之,GCC 是一種功能強(qiáng)大,可擴(kuò)展,跨平臺(tái)的編譯器,適用于多種編程語(yǔ)言和目標(biāo)平臺(tái)。 GCC(GNU Compiler Collection)是一款免費(fèi)開(kāi)源的編譯器集合,是GNU計(jì)劃的一部分。它被廣泛應(yīng)用于各種平臺(tái)上的軟件開(kāi)發(fā)和編譯工作中,包括嵌入式系統(tǒng),桌面應(yīng)用程序,服務(wù)器應(yīng)用程序,游戲開(kāi)發(fā)等領(lǐng)域。
GCC編譯器特點(diǎn)
1.免費(fèi)開(kāi)源:GCC是免費(fèi)開(kāi)源的,任何人都可以免費(fèi)下載、使用和修改它。這使得它在軟件開(kāi)發(fā)領(lǐng)域中廣泛應(yīng)用。
2.跨平臺(tái):GCC可以在多種操作系統(tǒng)和平臺(tái)上運(yùn)行,包括Linux、Windows、Mac OS X、BSD、Solaris等。開(kāi)發(fā)人員只需要下載適合自己操作系統(tǒng)的版本即可輕松編譯程序。
3.支持多種編程語(yǔ)言:GCC支持多種編程語(yǔ)言,包括C、C++、Java、Objective-C等。這使得開(kāi)發(fā)人員可以使用一款編譯器集合,開(kāi)發(fā)各種類型的應(yīng)用程序。
4.高質(zhì)量代碼生成:GCC通過(guò)使用現(xiàn)代優(yōu)化算法和優(yōu)化技術(shù),生成高質(zhì)量的機(jī)器代碼。這使得編譯出的程序在執(zhí)行速度和占用內(nèi)存等方面都有很好的表現(xiàn)。
5.可擴(kuò)展性:GCC具有很高的可擴(kuò)展性,使用插件和擴(kuò)展可以實(shí)現(xiàn)更多的功能。它還可以與其他工具和庫(kù)集成,如gdb、strace等。
GCC編譯器功能
1.編譯C程序:GCC可以編譯C程序,生成可執(zhí)行文件或庫(kù)文件。
2.編譯C++程序:GCC可以編譯C++程序,生成可執(zhí)行文件或庫(kù)文件。
3.編譯Objective-C程序:GCC可以編譯Objective-C程序,生成可執(zhí)行文件或庫(kù)文件。
4.編譯Java程序:GCC可以編譯Java程序,生成Java字節(jié)碼文件。
5.調(diào)試程序:GCC集成了gdb調(diào)試工具,可以在編譯期間生成調(diào)試信息,方便開(kāi)發(fā)人員進(jìn)行程序調(diào)試。
6.生成匯編代碼:GCC可以生成匯編代碼,方便了解代碼內(nèi)部運(yùn)行機(jī)制和優(yōu)化情況。
7.優(yōu)化程序:GCC通過(guò)使用優(yōu)化技術(shù)可以生成高質(zhì)量的目標(biāo)代碼,提高程序的執(zhí)行效率和優(yōu)化程度。
安裝教程
一、安裝了MinGW,在其根目錄下的bin文件夾中發(fā)現(xiàn)有等文件。為了測(cè)試,在該文件夾中新建了一個(gè)test.bat文件,將其中內(nèi)容寫(xiě)為:gcc test.cpp
二、在該文件夾中創(chuàng)建test.cpp文件并將其內(nèi)容設(shè)置為:
1.雙擊test.bat文件,發(fā)現(xiàn)該文件夾中產(chǎn)生了一個(gè)a.exe文件,執(zhí)行該exe文件,發(fā)現(xiàn)其與預(yù)期編譯效果一致,說(shuō)明編譯成功。gcc –o name test.cpp
2.可以生成名為name.exe的可執(zhí)行程序
3.把指令改為gcc –e test.cpp >test.txt 后,提示錯(cuò)誤gcc: no input files
4.而把參數(shù)E改為大寫(xiě)之后問(wèn)題即解決:gcc –E test.cpp > test.txt
使用方法
一、Gcc編譯器常用選項(xiàng)
1.編譯選項(xiàng)
gcc有超過(guò)100個(gè)的編譯選項(xiàng)可用。具體的可以使用命令man gcc察看
2.優(yōu)化選項(xiàng)
用GCC編譯C/C++代碼時(shí),它會(huì)試著用最少的時(shí)間完成編譯并且編譯后的代碼易于調(diào)試。易于調(diào)試意味著編譯后的代碼與源代碼有同樣的執(zhí)行順序,編譯后的代碼沒(méi)有經(jīng)過(guò)優(yōu)化。有很多的選項(xiàng)可以告訴GCC在耗費(fèi)更多編譯時(shí)間和犧牲易調(diào)試性的基礎(chǔ)上產(chǎn)生更小更快的可執(zhí)行文件。這些選項(xiàng)中最典型的就是-O和-O2。-O選項(xiàng)告訴gcc對(duì)源代碼進(jìn)行基本優(yōu)化。-O2選項(xiàng)告訴GCC產(chǎn)生盡可能小的和盡可能快的代碼。還有一些很特殊的選項(xiàng)可以通過(guò)man gcc察看
3.調(diào)試和剖析選項(xiàng)
GCC支持?jǐn)?shù)種調(diào)試剖析選項(xiàng)。在這些選項(xiàng)中最常用的是-g和-pg.-g選項(xiàng)告訴gcc產(chǎn)生能被GNU調(diào)試器(如gdb)使用的調(diào)試信息,以便調(diào)試用戶的程序。-pg選項(xiàng)告訴gcc在用戶的程序中加入額外的代碼,執(zhí)行時(shí),產(chǎn)生gprof用的剖析信息以顯示程序的耗時(shí)情況
二、使用GDB方法
1.在命令行中鍵入gdb并按回車就可以運(yùn)行g(shù)db了,啟動(dòng)gdb后,能在命令行上制定很多的選項(xiàng),也可以下面的方式來(lái)運(yùn)行g(shù)db: gdb filename 用這種方式運(yùn)行g(shù)db時(shí),能直接指定想要調(diào)試的程序。在命令行上健入gdb -h得到一個(gè)有關(guān)gdb的選項(xiàng)的說(shuō)明簡(jiǎn)單列表
2.編譯代碼以供調(diào)試,為了使gdb工作,必須使程序在編譯時(shí)包含調(diào)試信息,調(diào)試信息包含程序里的每個(gè)變量的類型,在可執(zhí)行文件里的地址映射以及源代碼的行號(hào)。gdb利用這些信息使源代碼和機(jī)器碼相關(guān)聯(lián)
三、內(nèi)容錯(cuò)誤查找
1.運(yùn)行 gdb bugging 命令,裝入 bugging 可執(zhí)行文件
2.執(zhí)行裝入的 bugging 命令
3.使用 where 命令查看程序出錯(cuò)的地方
4.利用 list 命令查看調(diào)用 gets 函數(shù)附近的代碼
5.唯一能夠?qū)е?gets 函數(shù)出錯(cuò)的因素就是變量string,用print命令查看string的值
6.在 gdb 中,我們可以直接修改變量的值,只要將 string 取一個(gè)合法的指針值就可以了,為此,我們?cè)诘?1行處設(shè)置斷
7.程序重新運(yùn)行到第11行處停止,這時(shí),我們可以用 set variable 命令修改 string 的取值
8.然后繼續(xù)運(yùn)行,將看到正確的程序運(yùn)行結(jié)果
使用示例
一、示例代碼
int main(void)
{printf("hello\n")
return 0
二、預(yù)編譯過(guò)程
1.這個(gè)過(guò)程處理宏定義和include,并做語(yǔ)法檢查
2.可以看到預(yù)編譯后,代碼從6行擴(kuò)展到了910行
三、編譯過(guò)程
這個(gè)階段,生成匯編代碼
四、匯編過(guò)程
1.這個(gè)階段,生成目標(biāo)代碼
2.此過(guò)程生成ELF格式的目標(biāo)代碼
五、鏈接過(guò)程
鏈接過(guò)程。生成可執(zhí)行代碼。鏈接分為兩種,一種是靜態(tài)鏈接,另外一種是動(dòng)態(tài)鏈接。使用靜態(tài)鏈接的好處是,依賴的動(dòng)態(tài)鏈接庫(kù)較少,對(duì)動(dòng)態(tài)鏈接庫(kù)的版本不會(huì)很敏感,具有較好的兼容性;缺點(diǎn)是生成的程序比較大。使用動(dòng)態(tài)鏈接的好處是,生成的程序比較小,占用較少的內(nèi)存
六、程序運(yùn)行
七、以hello.c為例子,在這四個(gè)步驟中可以設(shè)置選項(xiàng)分別生成hello.i, hello.s, hello.o以及最終的hello文件:
hello.c: 最初的源代碼文件
hello.i: 經(jīng)過(guò)編譯預(yù)處理的源代碼
hello.s: 匯編處理后的匯編代碼
hello.o: 編譯后的目標(biāo)文件,即含有最終編譯出的機(jī)器碼,但它里
面所引用的其他文件中函數(shù)的內(nèi)存位置尚未定義
hello / a.out: 最終的可執(zhí)行文件
文件類型
.c為后綴的文件,C語(yǔ)言源代碼文件
.a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫(kù)文件
.C,.cc或.cxx 為后綴的文件,是C++源代碼文件且必須要經(jīng)過(guò)預(yù)處理
.h為后綴的文件,是程序所包含的頭文件
.i 為后綴的文件,是C源代碼文件且不應(yīng)該對(duì)其執(zhí)行預(yù)處理
.ii為后綴的文件,是C++源代碼文件且不應(yīng)該對(duì)其執(zhí)行預(yù)處理
.m為后綴的文件,是Objective-C源代碼文件
.mm為后綴的文件,是Objective-C++源代碼文件
.o為后綴的文件,是編譯后的目標(biāo)文件
.s為后綴的文件,是匯編語(yǔ)言源代碼文件
.S為后綴的文件,是經(jīng)過(guò)預(yù)編譯的匯編語(yǔ)言源代碼文件
執(zhí)行程序
1、Pre-Processing預(yù)處理
gcc -E hello.c -o hello.i //完成頭文件和宏定義的展開(kāi),生成hello.i預(yù)處理文件
2、Compiling編譯
gcc -S hello.i //生成匯編代碼,生成hello.s的匯編文件
3、Assembling 匯編
gcc -c hello.s //生成二進(jìn)制目標(biāo)文件,生成hello.o文件
4、Linking 鏈接
gcc hello.o -o hello //鏈接相關(guān)庫(kù),生成可執(zhí)行文件hello,沒(méi)有后綴
PS:一般生成可執(zhí)行程序,可以直接:gcc hello.c -o hello
命令
在gdb提示符處鍵入help,將列出命令的分類,主要的分類有:
aliases:命令別名
breakpoints:斷點(diǎn)定義
data:數(shù)據(jù)查看
files:指定并查看文件
internals:維護(hù)命令
running:程序執(zhí)行
stack:調(diào)用棧查看
statu:狀態(tài)查看
tracepoints:跟蹤程序執(zhí)行
鍵入help后跟命令的分類名,可獲得該類命令的詳細(xì)清單:
break NUM 在指定的行上設(shè)置斷點(diǎn)
bt 顯示所有的調(diào)用棧幀。該命令可用來(lái)顯示函數(shù)的調(diào)用順序
clear 刪除設(shè)置在特定源文件、特定行上的斷點(diǎn)。其用法為:clear FILENAME:NUM
continue 繼續(xù)執(zhí)行正在調(diào)試的程序。該命令用在程序由于處理信號(hào)或斷點(diǎn)而導(dǎo)致停止運(yùn)行時(shí)
display EXPR 每次程序停止后顯示表達(dá)式的值。表達(dá)式由程序定義的變量組成
file FILE 裝載指定的可執(zhí)行文件進(jìn)行調(diào)試
help NAME 顯示指定命令的幫助信息
info break 顯示當(dāng)前斷點(diǎn)清單,包括到達(dá)斷點(diǎn)處的次數(shù)等
info files 顯示被調(diào)試文件的詳細(xì)信息
info func 顯示所有的函數(shù)名稱
info local 顯示當(dāng)函數(shù)中的局部變量信息
info prog 顯示被調(diào)試程序的執(zhí)行狀態(tài)
info var 顯示所有的全局和靜態(tài)變量名稱
kill 終止正被調(diào)試的程序
list 顯示源代碼段
make 在不退出 gdb 的情況下運(yùn)行 make 工具
next 在不單步執(zhí)行進(jìn)入其他函數(shù)的情況下,向前執(zhí)行一行源代碼
print EXPR 顯示表達(dá)式 EXPR 的值
處理器架構(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編譯器亮點(diǎn)
1.靈活的交叉編譯:GCC可以進(jìn)行交叉編譯,從一個(gè)平臺(tái)往不同的平臺(tái)生成可執(zhí)行文件或庫(kù)文件,具有很高的靈活性。
2.生成優(yōu)化代碼:GCC支持很多優(yōu)化選項(xiàng),可以生成效率更高的目標(biāo)代碼,提升程序的性能。
3.開(kāi)源、免費(fèi)并且具有適用性:GCC是免費(fèi)的開(kāi)源軟件,適用于各種操作系統(tǒng)和編程語(yǔ)言,受到廣泛的認(rèn)可和使用。
4.支持重定位:GCC可以支持可執(zhí)行文件或庫(kù)文件中的symbol重定位,在軟件的開(kāi)發(fā)和維護(hù)過(guò)程中更加靈活。
5.優(yōu)秀的兼容性:GCC支持標(biāo)準(zhǔn)C和C++語(yǔ)法,支持大多數(shù)的平臺(tái)和操作系統(tǒng),使用libtool、autoconf和automake工具可以方便的使用編譯和構(gòu)建自己的代碼。
6.高質(zhì)量的生成代碼:GCC可以根據(jù)硬件架構(gòu)和指令集生成高質(zhì)量的目標(biāo)代碼,保證編程的高效性。
更新日志
Gcc編譯器 v10.0更新內(nèi)容
1、帶來(lái)了一組關(guān)于鏈接時(shí)優(yōu)化 (LTO) 框架可提升伸縮性和降低內(nèi)存使用
2、在64位系統(tǒng)上需要8G內(nèi)存來(lái)對(duì)Firefox進(jìn)行優(yōu)化,然而用了LTO后只需3G
3、支持更多C++11標(biāo)準(zhǔn),包括原子性、C++11 內(nèi)存模型,用戶定義文字、別名聲明、構(gòu)造器委派和可擴(kuò)展的語(yǔ)法等
4、改進(jìn)對(duì) Fortran 的支持
5、支持Google Go 1等等多項(xiàng)改進(jìn)
6、進(jìn)一步加強(qiáng)了對(duì)已C++11的支持
以上便是KKX小編給大家分享的Gcc編譯器,這款GCC編譯器是一款功能強(qiáng)大的編譯器集合,具有廣泛的適用性和靈活性,可以幫助開(kāi)發(fā)人員快速地編寫(xiě)各種類型的應(yīng)用程序,是軟件開(kāi)發(fā)過(guò)程中不可或缺的工具。