1. 程式人生 > >在Windows環境下使用gcc生成可執行程式簡介

在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就能看到執行結果。