學習啦 > 知識大全 > 知識百科 > 百科知識 > gcc的用法有哪些

gcc的用法有哪些

時間: 謝君787 分享

gcc的用法有哪些

  GCC的初衷是為GNU操作系統(tǒng)專門編寫的一款編譯器,那么你對GCC了解多少呢?下面就讓學習啦小編來給你科普一下什么是gcc。

  gcc的創(chuàng)作背景

  GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發(fā)的編程語言編譯器。它是以GPL許可證所發(fā)行的自由軟件,也是 GNU計劃的關鍵部分。GCC原本作為GNU操作系統(tǒng)的官方編譯器,現已被大多數類Unix操作系統(tǒng)(如Linux、BSD、Mac OS X等)采納為標準的編譯器,GCC同樣適用于微軟的Windows。GCC是自由軟件過程發(fā)展中的著名例子,由自由軟件基金會以GPL協(xié)議發(fā)布。

  GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。后來又擴展能夠支持更多編程語言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各類處理器架構上的匯編語言等,所以改名GNU編譯器套件(GNU Compiler Collection)。

  gcc的結構

  GCC的外部接口長得像一個標準的Unix編譯器。使用者在命令列下鍵入gcc之程序名,以及一些命令參數,以便決定每個輸入檔案使用的個別語言編譯器,并為輸出程序碼使用適合此硬件平臺的組合語言編譯器,并且選擇性地執(zhí)行連接器以制造可執(zhí)行的程序。

  每個語言編譯器都是獨立程序,此程序可處理輸入的原始碼,并輸出組合語言碼。全部的語言編譯器都擁有共通的中介架構:一個前端解析符合此語言的原始碼,并產生一抽象語法樹,以及一翻譯此語法樹成為GCC的暫存器轉換語言〈RTL〉的后端。編譯器最佳化與靜態(tài)程序碼解析技術(例如FORTIFY_SOURCE,一個試圖發(fā)現緩沖區(qū)溢位〈buffer overflow〉的編譯器)在此階段應用于程序碼上。最后,適用于此硬件架構的組合語言程序碼以Jack Davidson與Chris Fraser發(fā)明的算法產出。

  幾乎全部的GCC都由C寫成,除了Ada前端大部分以Ada寫成。

  前端接口

  前端的功能在于產生一個可讓后端處理之語法樹。此語法解析器是手寫之遞歸語法解析器。

  直到2004年,程序的語法樹結構尚無法與欲產出的處理器架構脫鉤。而語法樹的規(guī)則有時在不同的語言前端也不一樣,有些前端會提供它們特別的語法樹規(guī)則。

  在2005年,兩種與語言脫鉤的新型態(tài)語法樹納入GCC中。它們稱為GENERIC與GIMPLE。語法解析變成產生與語言相關的暫時語法樹,再將它們轉成GENERIC。之后再使用"gimplifier"技術降低GENERIC的復雜結構,成為一較簡單的靜態(tài)唯一形式(Static Single Assignment form,SSA)基礎的GIMPLE形式。此形式是一個與語言和處理器架構脫鉤的全域最佳化通用語言,適用于大多數的現代編程語言。

  中介接口

  一般編譯器作者會將語法樹的最佳化放在前端,但其實此步驟并不看語言的種類而有不同,且不需要用到語法解析器。因此GCC作者們將此步驟歸入通稱為中介階段的部分里。此類的最佳化包括消解死碼、消解重復運算與全域數值重編碼等。許多最佳化技巧也正在實作中。

  后端接口

  GCC后端的行為因不同的前處理器宏和特定架構的功能而不同,例如不同的字符尺寸、呼叫方式與大小尾序等。后端接口的前半部利用這些訊息決定其RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉換成目標架構的格式。

  GCC的最佳化技巧依其釋出版本而有很大不同,但都包含了標準的最佳化算法,例如循環(huán)最佳化、執(zhí)行緒跳躍、共通程序子句消減、指令排程等等。而RTL的最佳化由于可用的情形較少,且缺乏較高階的資訊,因此相比較起來,增加的GIMPLE語法樹形式,便顯得比較不重要。

  后端經由一次重讀取步驟后,利用描述目標處理器的指令集時所取得的信息,將抽象暫存器替換成處理器的真實暫存器。此階段非常復雜,因為它必須關注所有GCC可移植平臺的處理器指令集的規(guī)格與技術細節(jié)。

  后端的最后步驟相當公式化,僅僅將前一階段得到的匯編語言代碼藉由簡單的子例程轉換其暫存器與內存位置成相對應的機器碼。

  gcc的基本用法

  在使用GCC編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,這里只介紹其中最基本、最常用的參數。具體可參考GCC Manual。

  GCC最基本的用法是∶gcc [options] [filenames]

  其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。

  -c,只編譯,不鏈接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。

  -o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執(zhí)行文件a.out。

  -g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。

  -O,對程序進行優(yōu)化編譯、鏈接,采用這個選項,整個源代碼會在編譯、鏈接過程中進行優(yōu)化處理,這樣產生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、鏈接的速度就相應地要慢一些。

  -O2,比-O更好的優(yōu)化編譯、鏈接,當然整個編譯、鏈接過程會更慢。

  -Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶

  A)#include <myinc.h>

  B)#include “myinc.h”

  其中,A類使用尖括號(< >),B類使用雙引號(“ ”)。對于A類,預處理程序cpp在系統(tǒng)預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾內搜索相應文件。

  -v gcc執(zhí)行時執(zhí)行的詳細過程,gcc及其相關程序的版本號

  原版gcc manual該選項英文解釋

  Print (on standard error output) the commands executed to run the stages of compilation. Also print the version number of the compiler driver program and of the preprocessor and the compiler proper.

  編譯程序時加上該選項可以看到gcc搜索頭文件/庫文件時使用的搜索路徑!
看過“gcc的用法”的人還看了:

1.Linux GCC命令的詳解

2.LINUX用YUM命令安裝GCC的方法

3.淺談基于MPLAYER 的RTSP客戶端設計與實現論文

4.編譯與鏈接的區(qū)別

5.如何定義全局變量

2144362