天天看點

gcc學習(一)[第二版]

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是自由軟體

gcc學習(一)[第二版]

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學習(一)[第二版]

gcc -S hello.i -o hello.s(編譯,生成彙編代碼)

gcc學習(一)[第二版]

gcc -c hello.s -o hello.o(彙編,生成二進制代碼)

gcc學習(一)[第二版]

gcc hello.o -o hello(連結:不需要額外選項,生成可執行檔案)

gcc學習(一)[第二版]

gcc hello.c -o hello(直接編譯連結成可執行目标檔案)

gcc -c hello.c或gcc -c hello.c -o hello.o(編譯生成可重定位目标檔案)

建議初學都加上-Wall選項。有些程式不加-Wall選項,編譯器不報任何錯誤,但是得到的結果卻不是預期的。如下:

gcc學習(一)[第二版]

一次性編譯

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

編譯後的庫檔案

gcc學習(一)[第二版]
gcc學習(一)[第二版]

發現是在連結階段出了錯!

gcc學習(一)[第二版]

繼續閱讀