在Windows環境下使用gcc生成可執行程式簡介
gcc(GNU編譯器套件)。gcc的初衷是為GNU作業系統專門編寫的一款編譯器,可以處理多種程式語言:C、C++、Objective-c 、Objective-c++、Fortran、 Java 、Ada 、Go及組合語言。
基本用法:
在使用gcc編譯器時,我們必須給出一系列必要的呼叫引數和檔名稱。呼叫引數大約有100多個,具體可參考GCC Manual。
用法:gcc [options][filenames]
其中options就是編譯器所需要的引數,filenames就是檔名。
-c,只編譯,不連結成為可執行檔案,編譯器只是由輸入的.c等原始碼檔案生成.o為字尾的目標檔案,通常用於編譯不包含主程式的子程式檔案。
-o output_filename,確定輸出檔案的名稱為output_filename,同時這個名稱不能和原始檔同名。如果不給出這個選項,gcc就給出預設的可執行檔案a.out。
-g,產生符號除錯工具(GNU的gdb)所必要的符號資訊,要相對原始碼進行除錯,我們就必須加入這個選項。
-O,對程式進行優化編譯、連結,採用這個選項,整個原始碼會在編譯,連結過程中進行優化處理,這樣產生的可執行檔案效率可以提高,但是,編譯、連結的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連結,當然整個編譯、連結過程會更慢。
-ldirname,將dirname所指出的目錄加入到程式標頭檔案目錄列表中,是在預編譯過程中使用的引數。C程式中的標頭檔案包含兩種情況:
A)#include <myinc.h>
B)#include "myinc.h"
其中,A類使用尖括號(<>),B類使用雙引號(" ")。對於A類,預處理程式cpp在系統預設包含檔案目錄(usr/include)中搜尋相應的檔案,而B類,前處理器程式在目標檔案的資料夾內搜尋相應檔案。
-v ,gcc執行時執行的詳細過程,gcc及其相關程式的版本號。編譯程式時加上該選項可以看到gcc搜尋標頭檔案/庫檔案時使用的搜尋路徑。
基本規則:
.c為字尾的檔案,C預言原始碼檔案;
.a為字尾的檔案,是由目標檔案構成的檔案庫檔案;
.C,.cc或.cxx為字尾的檔案,是C++原始碼檔案且必須要經過預處理;
.h為字尾的檔案,是程式所包含的標頭檔案;
.i為字尾的檔案,是C原始碼檔案且不應該對其執行預處理;
.ii為字尾的檔案,是C++原始碼碼檔案且不應該對其執行預處理;
.m為字尾的檔案,是Objective-C原始碼檔案;
.mm為字尾的檔案,是Objective-C++原始碼檔案;
.o為字尾的檔案,是編譯後的目標檔案;
.s為字尾的檔案,是組合語言原始碼檔案;
.S為字尾的檔案,是經過預編譯的組合語言原始碼檔案。
執行過程:
經過四個過程:預處理、編譯、彙編、連結。
命令gcc首先呼叫cpp進行預處理,在預處理過程中,對原始碼檔案中的檔案包含(include)、預編譯語句(如defune等)進行分析。接著呼叫cc1進行編譯,這個階段根據輸入檔案生成以.i為字尾的目標檔案。彙編過程是針對組合語言的步驟,呼叫as進行工作,一般來講,.S為字尾的組合語言原始碼檔案和彙編、.s為字尾的組合語言檔案經過預編譯和彙編之後都生成以.o為字尾的目標檔案。當多有的目標檔案都生成之後,gcc就呼叫ld來完成最後的關鍵性工作,這個階段就是連結。在連結階段,所有的目標檔案被安排在可執行程式中的恰當位置,同時,該程式所呼叫的庫函式也從各自所在的檔案庫中連到合適的地方。
執行過程示例:
使用示例
a.c原始碼
#include<stdio.h>
int main(void)
{
printf("hello\n");
getchar();
return 0;
}
在cmd中輸入命令 gcc a.c,若編譯通過的話會在當前目錄下生成一個a.exe檔案。我們執行a.exe就能看到執行結果。