嵌入式Linux C程式設計學習之路(三)——初識GCC
Gcc(GNU C Compiler)是GNU推出的功能強大、效能優越的多平臺編譯器,是GNU的代表作之一。Gcc可以在多種硬體平臺上編譯出可執行程式,其執行效率與一般的編譯器相比平均效率要高20%~30%。
Gcc最基本的用法是∶gcc [options] filenames
options:編譯器所需要的編譯選項 ,filenames: 要編譯的檔名。
vim hello.c→gcc hello.c→./a.out
在編譯選項預設情況下,預設生成a.out可執行檔案,使用bash可以直接執行該程式碼。
hello.c程式碼:
#include"stdio.h" void main() { printf("hello world\n"); }
執行a.out可以看出執行正常。
[[email protected] kkw]# ./a.out
hello world
GCC編譯器能將C/C++語言源程式、彙編程式形成可執行檔案。整個形成過程可以被細分為四個階段:Hello.c預處理→Hello.i編譯→Hello.s彙編→Hello.o連線→hello
Gcc通過後綴來區別輸入檔案的類別,常見型別有:
.c為字尾的檔案: C語言原始碼檔案
.a為字尾的檔案: 是由目標檔案構成的庫檔案
.C,.cc或.cxx 為字尾的檔案: 是C++原始碼檔案
.h為字尾的檔案: 標頭檔案
.o為字尾的檔案: 是編譯後的目標檔案
.s為字尾的檔案: 是組合語言原始碼檔案
在使用gcc編譯時,最重要的就是掌握gcc編譯選項,這些選項大約有一百個,大部分我們很少用到或者根本用不到,只有幾個根本的、最常用的選項,我們掌握了這幾個選項,使用gcc也就沒有太大問題了。
1:-o output_filename:確定可執行檔案的名稱為output_filename。如果不給出這個選項,gcc就給出預設的可執行檔案a.out。
[[email protected] kkw]# gcc -o hello.o hello.c
[[email protected] kkw]# ls
hello.c hello.o workspace 公共的 模板 視訊 圖片 文件 下載 音樂 桌面
[ [email protected] kkw]# ./hello.o
hello world
2:-O,對程式進行優化編譯、連結,採用這個選項,整個原始碼會在編譯、連線過程中進行優化處理,這樣產生的可執行檔案的執行效率可以提高,但是,編譯、連線的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連線,當然整個編譯、連線過程會更慢。
3:-c:不連結。編譯器只是由輸入的.c等原始碼檔案編譯生成.o為字尾的中間檔案。(二進位制檔案)
[[email protected] kkw]# gcc -c hello.c
[[email protected] kkw]# ls
a.out hello.o 公共的 視訊 文件 音樂
hello.c workspace 模板 圖片 下載 桌面
[[email protected] kkw]# ./hello.o
bash: ./hello.o: 許可權不夠
[[email protected] kkw]# chmod a+x hello.o
[[email protected] kkw]# ./hello.o
bash: ./hello.o: cannot execute binary file
4:-g:產生除錯工具(GNU的gdb)所需要的符號資訊,要想對編譯出的程式進行除錯,就必須加入這個選項
5:-I dirname: 將dirname所指出的目錄作為編譯器尋找標頭檔案的標準路徑。
C程式中的標頭檔案包含兩種情況∶
#include <A.h>
#include “B.h”
對於<>,gcc在系統預設的標頭檔案目錄(如/usr/include)中搜尋相應的檔案;而對於” ”,gcc在當前目錄中搜尋標頭檔案。-I選項的作用是告訴gcc,如果在當前目錄中沒有找到需要的檔案,就到指定的dirname目錄中去尋找。
gcc的作用僅為編譯器,他能讓我們更加深入瞭解程式碼執行的機制,對深入理解C語言有著很大的幫助。