gcc的工作流程
gcc的工作流程可以簡單分爲以下4步
- 預處理 --E
(1) 宏替換
(2) 頭文件展開
(3) 註釋去掉
xxx.c -> xxx.i
此時,xxx.i文件依然是c文件,其實內容並沒有什麼大的變化
命令爲 gcc -E hello.c hello.i
gcc默認的編譯工具 cpp
-
編譯 --S
生成彙編文件,此時xxx.s 爲彙編代碼的文件
xxx.i -> xxx.s
命令爲gcc -S hello.i -o hello.s
gcc默認工具爲gcc -
彙編 --c
生成二進制文件,此時xxx.o 爲二進制文件,可以被計算機直接執行
xxx.s ->xxx.o
命令爲gcc -c hello.s -o hello.o
gcc默認工具爲as -
鏈接
生成最終可執行文件
xxx.o ->xxx 沒有後綴,因爲可執行文件一般不加後綴
命令爲gcc hello.o -o hello
gcc默認工具爲ld
最終流程爲hello.c —> hello.i —> hello.s —> hello.o —> hello
總結,這些瞭解一下,記住4個步驟,出了報錯信息知道是哪個步驟出了問題就可以了,一般我們就用一個gcc hello.c -o hello(gcc會自動完成4個步驟)
gcc的常用參數
-
-v/–version 可以查看gcc的版本
-
-I 我們在編譯的時候指定頭文件的路徑,如果頭文件和.c文件在同一個目錄中,則無需指定路徑,但.h文件和.c文件不再一個目錄的時候,就需要指定頭文件的路徑,比如,hello.c文件中包含head.h文件,head.h文件在./include目錄中,就需要gcc hello.c -o hello -I ./include
-
-o 指定生成的程序的名稱
-
-g 使用gdb調試的時候必須加的參數(具體會在gdb的部分詳解)
-
-D 在編譯的時候指定一個宏
#include <iostream>
//#define DEBUG
int main()
{
#ifdef DEBUG
std::cout << "DEBUG defined" << std::endl;
#endif
return 0;
}
每個文件都定義一個宏是一件非常低效的事情,我們可以在文件中不定義宏,然後用-D參數去指定宏定義。
g++ test.c -o test -D DEBUG,這樣DEBUG宏就存在了。
- -Wall在編譯時會顯示警告信息,比如一些已經不推薦使用的版本的函數會出現警告信息。比如int c沒有被使用,在編譯時會出現c沒有被使用的警告。