HOWTO · C++

使用 GCC 編譯 C++ 程式

本文討論了一種使用 gcc 編譯器編譯 C++ 程式的方法。

本頁內容

若要使用 GCC 編譯並執行 C++ 原始碼檔,請使用 g++ 編譯器驅動程式:執行 g++ -o hello hello.cpp,再於 Linux 或 macOS 執行 ./hello。GCC 是 GNU 編譯器合集;對一般程式而言,g++ 會選用 C++ 建置方式,並連結 C++ 標準函式庫。下文將說明如何確認編譯器是否可用、撰寫第一個程式、看懂常見診斷訊息,以及建置包含多個檔案的小型程式。

認識 GCC 及其重要性

GCC 是一套編譯器合集,包含多種語言的編譯器驅動程式。使用 C++ 時,通常選擇 g++ 最簡單。建置過程會將原始碼編譯,並把產生的目的碼與所需函式庫連結成可執行檔。一條建置指令就能完成這兩個階段;較大型的專案則可能先分別編譯各個檔案,再進行連結。

gcc 驅動程式可以編譯 C++ 原始碼,但它不像 g++ 那樣會自動連結 C++ 標準函式庫。在 GNU/Linux 工具鏈上,可以搭配 -lstdc++ 明確要求連結該函式庫;不過函式庫的順序和平台細節可能有所影響,因此一般 C++ 建置建議使用 g++。C++ 原始碼常使用 .cpp 或 .cc 副檔名;在區分大小寫的系統上,GCC 也會將大寫的 .C 副檔名視為 C++ 原始碼。

安裝 GCC

先在終端機執行 g++ --version,確認是否已安裝 C++ 編譯器。若找到編譯器,這個指令會顯示其版本。若無法使用此指令,請透過作業系統的套件管理工具,或該系統建議的工具鏈供應者安裝 C++ 工具鏈。套件名稱和安裝步驟因系統而異;Ubuntu 和部分相關發行版的 build-essential 套件包含 GCC 與其他建置工具。在 Windows 上,可以安裝 MinGW-w64 等 GCC 工具鏈,並將其 bin 目錄加入 PATH,也可以使用其他受支援的 C++ 工具鏈。請依照所用發行版或工具鏈的現行指示操作,不要依賴舊範例中的版本號碼。

撰寫第一個 C++ 程式

在工作目錄中建立名為 hello.cpp 的檔案。這個程式會將一行文字寫入標準輸出:

執行此範例:

#include <iostream>

int main() {
    std::cout << "Hello, World!\n";
    return 0;
}
Hello, World!

#include <iostream> 提供 std::cout 使用的串流宣告。main 函式是程式的進入點,而 \n 會在輸出的文字後換行。

編譯 C++ 程式

在包含 hello.cpp 的目錄中,執行 g++ -o hello hello.cpp 來編譯程式並命名可執行檔。-o 選項用來指定輸出名稱;若未指定,GCC 在許多類 Unix 系統上會使用 a.out 等預設名稱。產生的檔案是可執行檔,而非目的檔。在 Linux 或 macOS 上,執行 ./hello 即可。在 Windows 命令提示字元中,通常可在目前目錄執行 hello.exe;實際指令取決於使用的殼層和工具鏈。

另一種適用於 GNU/Linux 的做法是執行 gcc -o hello hello.cpp -lstdc++,明確要求連結 C++ 標準函式庫。若建置系統要求使用 gcc 驅動程式,這個做法可能派得上用場;但對一般 C++ 程式而言,使用 g++ 較合適,因為它會自動選用適當的 C++ 連結方式。

除錯編譯錯誤

從左到右閱讀診斷訊息:它會指出原始碼檔案和行號,接著描述問題。例如,若程式使用 cout,卻未包含 <iostream>,也未將其限定為 std::cout,診斷訊息可能會指出 cout 未宣告。加入缺少的標頭檔,並改用 std::cout,然後重新建置。訊息的確切文字和行號會因編譯器版本與原始碼配置而異。

你可以使用 g++ -Wall -o hello hello.cpp,要求 GCC 啟用常見警告。-Wall 是實用的起點,但不會啟用 GCC 提供的所有警告。警告是診斷訊息,可能指出可疑的程式碼;請檢視警告,再判斷是否需要修改程式碼或建置選項。

連結多個檔案

程式可以在一個原始碼檔中定義函式,再從另一個檔案呼叫它。例如,main.cpp 可以包含 <iostream>、宣告 int add(int, int);,並定義 int main() { std::cout << add(2, 3) << '\n'; }。在 functions.cpp 中,定義 int add(int a, int b) { return a + b; }。相符的函式宣告與定義可讓編譯器檢查呼叫是否正確,並讓連結器將呼叫連接到實作。

使用一條指令建置這兩個原始碼檔:g++ -o my_program main.cpp functions.cpp。這會分別編譯各個原始碼檔,並將它們連結成可執行檔 my_program。在 Linux 或 macOS 上執行 ./my_program;此範例會輸出 5。在 Windows 上,請使用殼層支援的指令執行產生的 my_program.exe。

結論

一般使用 GCC 建置 C++ 程式時,請執行 g++ -o program source.cpp,再執行該指令產生的可執行檔。gcc 驅動程式也能編譯 C++,但 GNU/Linux 建置可能需要明確加入 -lstdc++。一般情況下,選用 g++ 就不必額外指定這個函式庫。

常見問題

  1. GCC 是什麼? GCC 是 GNU 編譯器合集,提供 C++、C 及其他語言的編譯器驅動程式。
  2. 如何確認是否已安裝 GCC? 執行 g++ --version 檢查 C++ 驅動程式,或執行 gcc --version 檢查 C 驅動程式。
  3. 為什麼編譯 C++ 時要用 g++ 而不是 gcc? g++ 會自動選用 C++ 連結方式,包括一般程式所需的標準函式庫。使用 gcc 時,GNU/Linux 建置可能需要明確加入 -lstdc++。
  4. 能否用一條指令編譯多個 C++ 檔案? 可以。在 g++ 指令中列出每個原始碼檔,例如 g++ -o my_program main.cpp functions.cpp。
  5. -o 有什麼作用? 它用來指定輸出檔案名稱;對 g++ -o hello hello.cpp 這類完整建置指令而言,輸出檔是可執行檔。