GCC(GNU Compiler Collection)是由GNU開(kāi)發(fā)的編程語(yǔ)言編譯器,最初是作為GNU操作系統(tǒng)的編譯器編寫(xiě)的。GCC是一個(gè)編譯器套件,包含很多軟件包,支持多種語(yǔ)言編譯。GCC的官網(wǎng)是http://gcc.gnu.org
1、GCC的安裝
Ubuntu默認(rèn)安裝了GCC,但軟件包可能不全,為了確保有一個(gè)基本完善的本地編譯環(huán)境,可安裝build-essential軟件包。在確保Linux能聯(lián)網(wǎng)的情況下,在終端輸入如下安裝命令:
elf@ubuntu:~$ sudo apt-get install build-essential |
也可以通過(guò)簡(jiǎn)單的命令安裝gcc:
elf@ubuntu:~$ sudo apt install gcc |
2、GCC的編譯選項(xiàng)
GCC的基本用法是:gcc [選項(xiàng)] 文件名
GCC有很多編譯控制選項(xiàng),使得GCC可以根據(jù)不同的參數(shù)進(jìn)行不同的編譯處理,我們簡(jiǎn)單介紹一些常用的基本控制選項(xiàng)。
3、GCC的基本使用
我們現(xiàn)在以我們學(xué)習(xí)語(yǔ)言的經(jīng)典的hello.c的編譯為例,對(duì)gcc的基本用法做一個(gè)了解。已編譯hello.c文件為例。創(chuàng)建測(cè)試?yán)搪窂?home/elf/work/example/hello,在該路徑下進(jìn)行hello.c文件的編寫(xiě)、編譯和運(yùn)行。
elf@ubuntu:~/work/example/hello$ vim hello.c |
測(cè)試?yán)虄?nèi)容如下:
#include<stdio.h>
int main(void) { printf("Hello World!n"); return 0; } |
用cd命令切換到hello文件夾下,通過(guò)gcc命令編譯hello.c文件:
elf@ubuntu:~/work/example/hello$ gcc hello.c -o hello_ubuntu |
可以看到,hello.c文件被編譯成功,生成可執(zhí)行文件hello_ubuntu,我們?cè)诮K端運(yùn)行./hello_ubuntu,可以看到輸出結(jié)果和我們程序的要求一致。如果編譯命令不添加-o hello_ubuntu,則編譯完成生成的是a.out可執(zhí)行文件,輸出結(jié)果是一樣的。
elf@ubuntu:~/work/example/hello$ gcc hello.c |
4、GCC編譯過(guò)程
GCC編譯器的編譯過(guò)程要經(jīng)過(guò)預(yù)處理,編譯,匯編,鏈接等4步才能夠生成可執(zhí)行文件。
預(yù)處理:主要實(shí)現(xiàn)將頭文件展開(kāi),宏定義替換以及解析條件編譯到文件中;
編譯:將預(yù)處理的代碼編譯轉(zhuǎn)換為匯編語(yǔ)言;
匯編:將匯編語(yǔ)言翻譯成二進(jìn)制文件;
鏈接:將匯編出來(lái)的多個(gè)二進(jìn)制目標(biāo)文件和庫(kù)文件進(jìn)行鏈接,生成可執(zhí)行文件。
我們可以通過(guò)一個(gè)簡(jiǎn)單的hello.c程序的編譯過(guò)程對(duì)GCC的整個(gè)編譯過(guò)程有一個(gè)簡(jiǎn)單的了解。
1)預(yù)處理
elf@ubuntu:~/work/example/hello$ gcc -E hello.c -o hello.i |
我們使用vim hello.i命令可以看到預(yù)處理文件有將近800行,預(yù)處理過(guò)程將一個(gè)不到10行的代碼,生成了一個(gè)將近800行的預(yù)處理文件。
2)編譯
這個(gè)過(guò)程是將hello.i預(yù)處理文件編譯成hello.s文件。
elf@ubuntu:~/work/example/hello$ gcc -S hello.i |
通過(guò)vim hello.s命令可以看到文件中都是匯編語(yǔ)句。
3)匯編
在終端輸入gcc –c hello.s將匯編語(yǔ)句生成機(jī)器碼,得到hello.o文件。
elf@ubuntu:~/work/example/hello$ gcc -c hello.s |
4)鏈接
機(jī)器碼不能夠直接運(yùn)行,我們通過(guò)鏈接得到可執(zhí)行文件hello。