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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章