C語言的編譯一般有三個步驟:
- 預編譯:
gcc -E -o a.e a.c
預編譯a.c文件,生成的目標文件名為a.e
預編譯就是將include包含的頭文件內容替換到C文件中,同時刪除代碼中沒用的注釋
示例:
//main.c
#include <stdio.h>
#include "sum.h"
int main(){
int m = 6;
int n = 5;
int result = sum(m,n); printf("hello\n%\n",result);
//sum.h
int sum(int x,int y);
運行之后結果為:
第一步就是這樣的啦!
2 . 編譯
gcc -S -o a.s a.e
將a.e翻譯成一個ASCII匯編語言文件a.s.
3 .鏈接
gcc -o a a.s
這行命令告訴gcc對源程序a.o進行鏈接,生成可執行程序a
gcc 沒有任何參數,表示就是鏈接
GCC編譯器的基本選項如下表:
類型 | 說明 |
-E | 預處理后即停止,不進行編譯、匯編及連接 |
-S | 編譯后即停止,不進行匯編及連接 |
-c | 編譯或匯編源文件,但不進行連接 |
-o file | 指定輸出文件file |
C語言的include頭文件
- include是要告訴編譯器,包含頭文件
- 在C語言中,任何的庫函數調用都需要包含頭文件
- 頭文件也相當於一個文檔聲明
- 如果把main函數放在第一個文件中,而把自定義函數放在第二個文件中,那么就需要在第一個文件中聲明函數原型
- 如果把函數原型包含在一個頭文件中,那么就不用每次使用函數的時候都聲明其原型了,把函數聲明放進頭文件中是個好習慣!
- 頭文件可以不需要編譯
- 可以查看具體的聲明
- 頭文件加上實現文件的o文件提交給使用者即可,不需要知道源代碼
- o文件預先編譯,所以整個項目編譯時,會大大提高編譯的時間 。
- 當一個文件(A.c文件)依賴於頭文件(b.h)時,如果b.c編譯之后形成的b.o文件重新編譯后,a.o的文件不需要重新編譯
- 可以極大降低手工復制,粘貼的錯誤幾率
頭文件的注意事項:
- <頭文件>,表示讓C語言編譯器在系統目錄(即gcc編譯器的include目錄下)下尋找相關的頭文件
- “頭文件”,表示讓C語言編譯器在用戶當前目錄下尋找相關的頭文件
- 如果是使用了C語言庫函數的需要的頭文件,那么一定是#include<>
- 如果是使用了用戶自定義的頭文件,那么一定是#include“”