GCC/G++編譯過程

1. gcc/g++簡介

  • gcc / g++分別是GNU的c & c++編譯器腾供,常用于在Linux下編譯C/C++程序,詳細(xì)介紹
    gcc钉疫。
  • gcc / g++執(zhí)行編譯的基本步驟主要有四步:
    第一步源哩,由后綴為.c/.cpp的源程序生成后綴為.i的預(yù)處理文件,預(yù)處理文件本質(zhì)也是c/cpp源程序识腿,只是進行了頭文件展開和宏替換;
    第二步造壮,由后綴為.i的預(yù)處理文件生成后綴為.s的匯編文件渡讼,這一步是將源程序轉(zhuǎn)化為匯編指令;
    第三步耳璧,由后綴為.s的匯編文件生成后綴為.o的機器代碼成箫,即二進制文件,但是這時候還不可以執(zhí)行旨枯;
    第四步蹬昌,把后綴為.o的機器代碼鏈接生成可執(zhí)行文件(默認(rèn)后綴為.out)。
  • 簡單表示:①test.cpp(第一步)—>②test.i(第二步)—>③test.s(第三步)—>④test.o(第四步)—>⑤test.out攀隔。

2. gcc/g++基本命令

下面皂贩,我們將運行實例演示上述過程。

2.1 g++ -o

  • 作用:指定生成目標(biāo)文件的名字昆汹,生成目標(biāo)文件先紫。若不加任何替他參數(shù),則直接由源程序生成可執(zhí)行文件筹煮。-o表示output name遮精,后面輸入指定生成文件的名字。
  • 例子:
# 命令行輸入:
g++ test.cpp -o test.out 

說明:該例子指定生成文件的名字為test.out,且沒有加任何替他參數(shù)本冲,因此最終生成可執(zhí)行文件test.out准脂,相當(dāng)于上面由①test.cpp——>⑤test.out。其中test.cpp文件為:

#include <iostream>

using namespace std;

int main(){
    cout << "Hello World" <<endl;
    return 0; 
}

結(jié)果:生成可執(zhí)行文件test.out檬洞,對test.out文件運行:

#當(dāng)前目錄下命令行輸入:
./test.out
#輸出:
Hello World

2.2 g++ -E

  • 作用:相當(dāng)于1中介紹的第一步狸膏,把頭文件展開,宏替換添怔,生成的目標(biāo)文件為C文件湾戳。
  • 例子:
# 命令行輸入:
g++ test.cpp -E -o test.i

說明:該例子指定生成文件的名字為test.i,且有參數(shù)-E广料,因此經(jīng)過預(yù)處理砾脑,由源程序test.cpp生成test.i預(yù)處理文件。相當(dāng)于上面由①test.cpp—>②test.i艾杏。test.cpp文件與2.1相同韧衣。
結(jié)果:生成預(yù)處理文件test.i。我這里生成的.i文件大約有20000多行代碼购桑。

# test.i部分代碼展示:
# 1 "test.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
......這里省略好多代碼
# 63 "/usr/include/c++/7/bits/memoryfwd.h" 3
  template<typename>
    class allocator;
  template<>
    class allocator<void>;
  template<typename, typename>
    struct uses_allocator;
}
......這里省略好多代碼

接著對生成的test.i文件進行處理:

# 命令行輸入:
g++ test.i -o test.out

說明:相當(dāng)于上面由②test.i—>⑤test.out畅铭,對test.out文件運行,與2.1結(jié)果相同勃蜘。

./test.out
#輸出:
Hello World

2.3 g++ -S

  • 作用:相當(dāng)于1中介紹的第一步和第二步硕噩,生成匯編文件。
  • 例子:
# 命令行輸入:
g++ -S test.cpp -o test.s

說明:該例子指定生成文件的名字為test.s缭贡,且有參數(shù)-S炉擅,因此經(jīng)過1中所說的第一步、第二步匀归,由源程序test.cpp生成test.s匯編文件。相當(dāng)于上面由①test.cpp—>③test.s耗帕。test.cpp文件與2.1相同穆端。
結(jié)果:生成匯編文件test.s,約90行左右仿便,如下所示:

/*
* test.s部分代碼展示:
*/
    .file   "test.cpp"
    .text
    .section    .rodata
    .type   _ZStL19piecewise_construct, @object
    .size   _ZStL19piecewise_construct, 1
_ZStL19piecewise_construct:
    .zero   1
    .local  _ZStL8__ioinit
    .comm   _ZStL8__ioinit,1,1
.LC0:
    .string "Hello world"
    .text
    .globl  main
    .type   main, @function
main:
.LFB1493:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
......這里省略好多代碼

接著對生成的test.s文件進行處理:

#命令行輸入:
g++ test.s -o test.out

說明:相當(dāng)于上面由③test.s——>⑤test.out体啰。對生成的test.out文件運行,與2.1結(jié)果相同嗽仪。

./test.out
#輸出:
Hello World

2.4 g++ -c

  • 作用:相當(dāng)于1中的第一步荒勇、第二步和第三步合起來,生成二進制文件闻坚,有待進一步鏈接成可執(zhí)行文件沽翔。
  • 例子:
#命令行輸入:
g++ -c test.cpp -o test.o

說明:該例子指定生成文件的名字為test.o,且有參數(shù)-c,因此相當(dāng)于經(jīng)過1中所說的第一步仅偎、第二步和第三步跨蟹,由源程序test.cpp生成test.o二進制文件。相當(dāng)于由①test.cpp—>④test.s橘沥。test.cpp文件與2.1相同窗轩。
結(jié)果:生成二進制文件test.o,但是還不能執(zhí)行座咆。
接著對生成的test.o文件進行處理:

# 命令行輸入:
g++ test.o -o test

說明:相當(dāng)于上面由④test.o——>⑤test.out痢艺。對生成的test.out文件運行,與2.1結(jié)果相同介陶。

./test.out
#輸出:
Hello World
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堤舒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斤蔓,更是在濱河造成了極大的恐慌植酥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弦牡,死亡現(xiàn)場離奇詭異友驮,居然都是意外死亡,警方通過查閱死者的電腦和手機驾锰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門卸留,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椭豫,你說我怎么就攤上這事耻瑟。” “怎么了赏酥?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵喳整,是天一觀的道長。 經(jīng)常有香客問我裸扶,道長框都,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任呵晨,我火速辦了婚禮魏保,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摸屠。我一直安慰自己谓罗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布季二。 她就那樣靜靜地躺著檩咱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上税手,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天蜂筹,我揣著相機與錄音,去河邊找鬼芦倒。 笑死艺挪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兵扬。 我是一名探鬼主播麻裳,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼器钟!你這毒婦竟也來了津坑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤傲霸,失蹤者是張志新(化名)和其女友劉穎疆瑰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昙啄,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡穆役,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梳凛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耿币。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖韧拒,靈堂內(nèi)的尸體忽然破棺而出淹接,到底是詐尸還是另有隱情,我是刑警寧澤叛溢,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布塑悼,位于F島的核電站,受9級特大地震影響楷掉,放射性物質(zhì)發(fā)生泄漏厢蒜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一靖诗、第九天 我趴在偏房一處隱蔽的房頂上張望郭怪。 院中可真熱鬧支示,春花似錦刊橘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春败晴,著一層夾襖步出監(jiān)牢的瞬間浓冒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工尖坤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稳懒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓慢味,卻偏偏與公主長得像场梆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纯路,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容