1.gcc參數詳解
參數 | 作用 | 實例 |
---|---|---|
-o | 指定目標名稱 | gcc main.c text.o -o main |
-c | 只激活預處理,編譯和彙編,只是會產生.o文件 | gcc -c hello.c |
-x | 指定語言,與後綴無關 | gcc -x c hello.cpg |
-S | 只激活預處理和編譯,即把文件編譯成爲彙編語言 | gcc -S hello.c |
-E | 只激活預處理,這個不生成文件 | gcc -E hello.c > text.txt |
-O0,-O1,-O2,-O3 | 優化選項 | gcc -O2 |
-g | 生成調試信息和gdb一起使用 | gcc -g |
-I | 指定額外的頭文件搜索路徑和DIRECTORY | gcc -I sub |
2. 程序生成過程
- 預編譯
gcc -E hello.c -o hello.i
預編譯階段,.c .h ---> .i
+ 頭文件stdio.h 庫文件 引用進來
+ 展開宏定義
- 彙編
gcc -S hello.i -o hello.S
+ 彙編代碼
- 編譯 .S --> .o obj文件
gcc -c hello.S -o hello.o
- 鏈接 win .exe linux .elf
gcc hello.o -o hello
3.語法
-
# 註釋
-
語法格式
目標文件:依賴文件,第一個文件應該是最終目標文件 -
僞目標 .PHONY:
我們希望每次編譯先把之前先編譯的文件先刪除
hello:hello.o
gcc hello.o -o hello
hello.o:hello.S
gcc -c hello.S -o hello.o
hello.S:hello.i
gcc -S hello.i -o hello.S
hello.i:hello.c
gcc -E hello.c -o hello.i
.PHONY:
#刪除所有文件
clearall:
rm -rf hello.i hello.S hello.o hello
#刪除過程文件
clear:
rm -rf hello.i hello.S hello.o
- 微觀過程:
.c .i .S .o
- 宏觀過程:
gcc -c xxx. -o xxx.o
- 變量
=(替換) +=(追加) :=(常量)
變量帶入 $(便令)
- 隱含規則
%.c任意的.c文件
%.o任意的.o文件
*.c所有的.c文件
*.o所有的.o文件
%.o:%.c
$(cc) -c %.c -o %.o
#任意的 .c匹配任意的 .o文件
- 通配符號
$^:所有的依賴文件
$@:所有的目標文件
$<:所有依賴文件的第一個文件
$>:所有依賴文件的最後一個文件