gcc 與 g++ 分別是 gnu 的 c & c++ 編譯器 gcc/g++ 在執行編譯工作的時候,總共需要4步:
- 預處理,生成 .i 的文件
- 將預處理后的文件轉換成匯編語言, 生成文件 .s
- 有匯編變為目標代碼(機器代碼)生成 .o 的文件
- 連接目標代碼,生成可執行程序
參數詳解
-c
只激活預處理,編譯,和匯編,也就是他只把程序做成obj文件
例子用法:
gcc -c hello.c
他將生成 hello.o 的 obj 文件
-S
只激活預處理和編譯,就是指把文件編譯成為匯編代碼。
例子用法:
gcc -S hello.c
他將生成 .s 的匯編代碼,你可以用文本編輯器察看。
-E
只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面。
例子用法:
gcc -E hello.c > pianoapan.txt
gcc -E hello.c | more
慢慢看吧,一個 hello word 也要與處理成800行的代碼。
-o
制定目標名稱,默認的時候,gcc 編譯出來的文件是 a.out。
例子用法:
gcc -o hello hello.c // 生成名為hello的.out可執行文件
gcc -o hello.asm -S hello.c // 生成名為hello.asm的匯編代碼
-l
提示編譯器尋找頭文件的目錄或路徑,當頭文件在另一個目錄下時可以使用 -I 來手動添加
使用gcc編譯多個.h .c 文件
.h.c文件在同一個目錄下
1.c
#include <stdio.h>
#include "my_head.h"
int main(int argc, char *argv[]){
print();
return 0;
}
2.c
#include <stdio.h>
#include "my_head.h"
void print(){
printf("Hello world!\n");
}
my_head.h
#ifndef myhead_h
#define myhead_h
void print();
#endif

假如他們都在一個目錄下面,那么編譯流程:
gcc -c 2.c // 只激活預處理,編譯,和匯編生成2.o文件
gcc -o main 1.c 2.o // 連接目標代碼,生成可執行程序main

.h.c文件在不同的目錄下
在稍微大一點的項目里面,一般都會包含多個文件。尤其是包含多個頭文件,各自頭文件的實現,和包含main函數的文件。這樣的好處就是更容易開發和維護。
舉一個簡單的例子,main.cpp 文件是包含main函數的文件,在myinclude的文件下,包含了myhead.h 和 myhead.cpp 文件。分別是頭文件的定義和實現。

下面開始編譯:
假如在當前目錄直接編譯的話:

直接編譯的結果就是報錯了,錯誤的原因是 默認的include目錄下面沒有 myhead.h 頭文件。
可以通過 -I 選項 鏈接上去。重新編譯。
仍然有報錯,錯誤的原因是頭文件雖然找到了,但是沒有定義print函數。print函數是在2.c文件內定義的。也就是需要把2.c文件編譯一下。

最后,再一次的編譯:

