1、 gcc是GNU Compiler Collection的縮寫。最初是作為C語言的編譯器(GNU C Compiler),作者為Richard Stallman,是GNU項目的奠基者;現在已經支援多種語言,如C、C++、Java、Pascal、Ada、COBOL語言等 。
2、主要特征:
gcc是一個可移植的編譯器,支援多種硬體平台,甚至對Don Knuth 設計的 MMIX 這類不常見的計算機都提供了完善的支援
gcc不僅僅是個本地編譯器,它還能跨平台交叉編譯(在本地編譯的程式,可以運作在其他平台之上)。
gcc有多種語言前端,用于解析不同的語言。
gcc是按子產品化設計的,可以加入新語言和新CPU架構的支援
gcc是自由軟體
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX1cGVOhXUE50dnpWTtBXblZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DN2MDMxgDNyEjMxATM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
1)預處理(Pre-Processing) [-E] #頭檔案展開
2)編譯(Compiling) [-S]
3)彙編(Assembling) [-c]
4)連結(Linking) [不加任何選項]
選項
作用
-E
預處理,生成.i檔案
-S
編譯,生成.s彙編檔案
-c
彙編,編譯源碼生成.o目标檔案
Null
連結,并不需要任何選項
-o
生成目标檔案,如.i,.o,.s,可執行檔案,預設為a.out檔案等
-Wall
使gcc對源代碼有問題的地方發出警告
-I[dir]
将dir加入頭檔案的搜尋路徑
-L[dir]
将dir加入庫檔案的搜尋路徑
-l[lib]
連結lib庫
-g
在目标檔案中嵌入調試資訊,以便gdb調試程式調試
-O
優化編譯後的代碼
-w
關閉所有警告資訊[不推薦]
示例
操作:
gcc -E hello.c -o hello.i(預處理)
gcc -S hello.i -o hello.s(編譯,生成彙編代碼)
gcc -c hello.s -o hello.o(彙編,生成二進制代碼)
gcc hello.o -o hello(連結:不需要額外選項,生成可執行檔案)
gcc hello.c -o hello(直接編譯連結成可執行目标檔案)
gcc -c hello.c或gcc -c hello.c -o hello.o(編譯生成可重定位目标檔案)
建議初學都加上-Wall選項。有些程式不加-Wall選項,編譯器不報任何錯誤,但是得到的結果卻不是預期的。如下:
一次性編譯
gcc [-Wall] hello_fn.c main.c –o newhello
獨立編譯
gcc -Wall -c main.c -o main.o
gcc -Wall -c hello_fn.c -o hello_fn.o
gcc -Wall main.o hello_fn.o -o newhello #連結生成可執行檔案
優點:如果隻是改動了一個子產品,則不用再次編譯全部子產品,以節省編譯時間[推薦]
附-測試程式
附-Makefile
CC = gcc
CFLAGS = -Wall -g
BIN = main
SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:.c=.o)
.PHONY: all clean
all: $(BIN)
$(BIN): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
-rm -rf $(BIN) $(OBJECTS)
擴充名
含義
.c
C源檔案
.cpp/cc
C++源檔案
.o
目标檔案
.s
彙編語言源檔案
.a/.so
編譯後的庫檔案
發現是在連結階段出了錯!