C 語言編譯器的作用是將 C 程序的源碼翻譯成特定計算機硬件上可執行的二進制文件。
在默認 C 程序的編譯與運行發生在同一環境的前提下,根據可執行文件運行的環境可以將 C 語言編譯器分為桌面操作系統和嵌入式操作系統兩大類。
桌面操作系統上的 C 語言編譯器
桌面操作系統上常用的 C 語言編譯器有:
- Visual C++
- GCC
- Clang
當前主流的三類桌面操作系統及其上常用的編譯器為:
- Windows: Visual C++ / GCC / Clang
- Unix/Linux: GCC / Clang
- OS X/iOS: Clang
Visual C++ (簡稱 MSVC ) 是微軟開發的 C 編譯器,只能用於 Windows 系統。
MSVC 是非開源軟件,個人用戶可以通過社區版 Visual Studio 免費使用該編譯器。
但是未經微軟授權, MSVC 不能應用到商業化產品。
GCC(GNU Compiler Collection/GNU 編譯器套件) 是由 GNU 開發的編譯器。
GNU 編譯器套件包括 C、C++、 Objective-C、 Fortran、Java、Ada 和 Go 語言前端, 也包括了這些語言的庫。
GCC 的初衷是為 GNU 操作系統專門編寫的一款編譯器。
Clang 編譯器是 LLVM 項目的一部分,由於該項目是在 Apple 主推下發展的,所以在 OS X 系統中,Clang 編譯器又被稱為 Apple LLVM 編譯器。
GCC 和 Clang 可用於 Windows 系統,但主要用於 Unix/Linux 系統。
GCC 與 Clang 編譯器編譯出的可執行程序一般沒有任何限制,應用程序可以隨意發布和商用。
嵌入式系統上的 C 語言編譯器
不同型號的嵌入式設備常常需要對應的配套編譯器,常見的有:
- Keil C51: Keil公司的 51 系列單片機
- AVR GCC: Arduino 開發板
- ADS、RVDS、DS-5 Studio: ARM 架構設備
- CCS: TI 公司的 DSP 設備
- Visual DSP++: ADI 公司的 DSP 設備
Windows 系統安裝 GCC 的方法
GCC 的初衷是為 GNU 操作系統專門編寫一款編譯器, 現已被大多數類 Unix 操作系統(如 Linux、BSD 等)采納為標准的編譯器。
在 Windows 系統上使用 GCC 編譯器需要借助 MinGW(Minimalist GCC for Windows) 提供一組包含文件和端口庫,好讓控制台模式的程序能夠使用微軟的標准C運行時庫(C Runtime/MSVCRT.DLL)。
從 MinGW Download 可以下載 MinGW-get 程序。
MinGW-get 是 MinGW 的一個包管理程序, 用來管理各類包含文件與端口庫。
安裝好需要的包后即可在 Windows 終端上調用 GCC 來編譯指定源碼。
GCC 的基本使用方法
GCC 的詳細用法可以參考 GCC Manual 。此處簡單介紹 GCC 的基本用法。
GCC 編譯的基本語法為:
gcc [options] [filenames]
其中[options]
是輸入參數,[filenames]
是各輸入/輸出文件名。
GCC 編譯的常用參數包含:
-
[-c]
只編譯, 不鏈接成可執行文件; 輸入源代碼*.c
文件, 輸出*.o
目標文件; 常用於編譯不含主程序的子程序文件。 -
[-o OUTPUT_FILENAME]
GCC 默認輸出的可執行文件名為a.out
; 此參數可將輸出文件名設置為OUTPUT_FILENAME
,GCC 要求設置文件名不能和源文件同名。 -
[-g]
產生符號調試工具 (GDB) 所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。 -
[-O]
編譯過程中對程序進行優化; 在編譯、鏈接采用這個選項,源代碼會在編譯、鏈接過程中被編譯器優化處理,以產生執行效率更高的可執行程序; 但編譯、鏈接的速度會相應降低。 -
[-O2]
編譯器會執行比-O
更深度的優化, 同時編譯速度也更慢。 -
[-I DIRNAME]
將DIRNAME
指示的目錄加入到程序頭文件目錄列表中;用於預編譯過程。 -
[-v]
打印出 GCC 相關程序的版本號以及編譯器執行時的詳細過程信息; 此參數可用於查看 GCC 搜索頭文件及庫文件時使用的搜索路徑。
(注)
C 程序有兩種預編譯指令可用於包含頭文件
#include <stdio.h>
#include "stdio.h"
使用尖括號包含頭文件時, 編譯器在預編譯時會在系統路徑包含的目錄中搜索該文件; 使用雙引號包含頭文件時,編譯器會在源碼文件所在的文件夾中搜索該文件。
GCC 相關文件
*.h
程序所包含的頭文件;*.c
C 源代碼文件;*.i
C 源代碼文件且不應進行預處理;*.o
編譯后的目標文件(Object File);*.a
目標文件構成的檔案庫文件;*.out
鏈接后輸出的可執行文件;*.C / *.cc / *.cxx
C++ 源代碼文件且必須要經過預處理;*.ii
C++ 源代碼文件且不應進行預處理;*.m
Objective-C 源代碼文件;*.mm
Objective-C++ 源代碼文件;*.s
匯編語言源代碼文件;*.S
經過預編譯的匯編語言源代碼文件。