gcc学习(一)[第二版]
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 | 關閉所有警告信息[不推薦] |
?
?
示例
//測試程序 #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選項。有些程序不加-Wall選項,編譯器不報任何錯誤,但是得到的結果卻不是預期的。如下:
//bad.c #include <stdio.h>int main(int argc,char *argv[]) {printf("2 + 2 = %f\n",4);return 0; }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 #鏈接生成可執行文件
優點:如果只是改動了一個模塊,則不用再次編譯全部模塊,以節省編譯時間[推薦]
?
附-測試程序
//hello_fu.h #ifndef _HELLO_FUN_H #define _HELLO_FUN_Hvoid 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)
gcc需要識別文件擴展名
?
擴展名 | 含義 |
.c | C源文件 |
.cpp/cc | C++源文件 |
.o | 目標文件 |
.s | 匯編語言源文件 |
.a/.so | 編譯后的庫文件 |
?
?
?
用gcc發現出錯之處
?
發現是在鏈接階段出了錯!
?
?
C/C++編譯完成之后的代碼是不同的
?
總結
以上是生活随笔為你收集整理的gcc学习(一)[第二版]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [RCNN]-[YOLO]-[SSD]目
- 下一篇: Altiris 7.1 安装