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