一、 gcc是GNU Compiler Collection的縮寫。前端
最初是做爲C語言的編譯器(GNU C Compiler),做者爲Richard Stallman。是GNU項目的奠定者;現在已經支持多種語言。如C、C++、Java、Pascal、Ada、COBOL語言等 。架構
二、主要特徵:模塊化
gcc是一個可移植的編譯器,支持多種硬件平臺,甚至對Don Knuth 設計的 MMIX 這類不常見的計算機都提供了無缺的支持 優化
gcc不不過個本地編譯器,它還能跨平臺交叉編譯(在本地編譯的程序。可以運行在其它平臺之上)。spa
gcc有多種語言前端。用於解析不一樣的語言。設計
gcc是按模塊化設計的,可以增長新語言和新CPU架構的支持調試
gcc是自由軟件code
1)預處理(Pre-Processing) [-E] #頭文件展開ci
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 |
關閉全部警告信息[不推薦] |
演示樣例
//測試程序 #include <stdio.h> #define HELLO "Hello World!!!\n" int main(int argc,char *argv[]) { printf(HELLO); return 0; }
操做:
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選項,編譯器不報不論什麼錯誤,但是獲得的結果卻不是預期的。例如如下:
//bad.c #include <stdio.h> int main(int argc,char *argv[]) { printf("2 + 2 = %f\n",4); return 0; }
一次性編譯
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 #連接生成可運行文件
長處:假設不過修改了一個模塊,則不用再次編譯全部模塊。以節省編譯時間[推薦]
附-測試程序
//hello_fu.h #ifndef _HELLO_FUN_H #define _HELLO_FUN_H void hello(const char *str); #endif
//hello_fu.c #include <stdio.h> #include "hello_func.h" void hello(const char *str) { printf("Hello %s\n",str); printf("Compiled: "__DATE__" at "__TIME__"\n"); printf("This is line %d of file %s\n",__LINE__,__FILE__); return; }
//main.c #include "hello_func.h" int main() { hello("world"); return 0; }
附-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 |
編譯後的庫文件 |
發現是在連接階段出了錯!