【科技友瘋狂】GCC 編譯器入門:基本指令與使用指南

關鍵字 :CPUCommand全端工程師修煉日記linux

在 C/C++ 開發中,GCC(GNU Compiler Collection) 是最常用的編譯器之一。它支援多種語言,包括 C、C++、Objective-C、Fortran 等,並且適用於 Linux、macOS 及 Windows(透過 MinGW)。

如果你想學習如何使用 GCC 來編譯程式,這篇文章將帶你掌握 GCC 的基本指令與常見選項,幫助你快速上手 C/C++ 開發!


1. 安裝 GCC

在 Linux / macOS 安裝 GCC

在 Linux(如 Ubuntu)上,可以使用以下指令安裝 GCC:

sudo apt update
sudo apt install gcc

macOS 則可以使用 Homebrew 安裝:

brew install gcc

在 Windows 安裝 GCC

Windows 需要安裝 MinGWMSYS2 來獲取 GCC,推薦使用 MSYS2:

  1. 下載 MSYS2:https://www.msys2.org/
  2. 在 MSYS2 終端輸入以下指令安裝 GCC:
    pacman -S mingw-w64-ucrt-x86_64-gcc
    
  3. 確認安裝成功:
    gcc --version
    

2. GCC 基本編譯指令

1. 編譯 C 程式

假設我們有一個簡單的 C 程式 hello.c

#include <stdio.h>

int main() {
    printf("Hello, GCC!\n");
    return 0;
}

使用 GCC 進行編譯:

gcc hello.c -o hello

這行指令的意思是:

  • gcc:使用 GCC 編譯器
  • hello.c:要編譯的 C 原始碼檔案
  • -o hello:指定輸出執行檔名稱為 hello

執行編譯後的程式:

./hello

如果沒有指定 -o,GCC 預設會產生一個名為 a.out 的可執行檔,執行時使用:

./a.out

2. 編譯 C++ 程式

如果是 C++ 程式(例如 hello.cpp):

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, GCC!" << endl;
    return 0;
}

使用 g++(GCC 的 C++ 編譯器)來編譯:

g++ hello.cpp -o hello

執行程式:

./hello

3. 啟用最佳化(Optimization)

GCC 提供不同的最佳化等級,可以讓程式執行得更快:

最佳化選項 說明
-O0 無最佳化(預設)
-O1 基礎最佳化,提升效能但不影響可讀性
-O2 進階最佳化,適用於大部分應用
-O3 最高級別最佳化,可能會增加編譯時間
-Os 針對減少執行檔大小進行最佳化

範例:

gcc -O2 hello.c -o hello

這樣編譯後的執行檔會比 -O0 最佳化程度更高,執行速度更快。


3. 常見 GCC 選項

1. 顯示詳細警告(-Wall)

-Wall 會啟用所有常見的警告,幫助發現潛在錯誤:

gcc -Wall hello.c -o hello

如果你想要更嚴格的警告,可以加上 -Wextra

gcc -Wall -Wextra hello.c -o hello

2. 偵錯模式(-g)

-g 讓 GCC 產生 除錯資訊,方便用 GDB 進行偵錯:

gcc -g hello.c -o hello
gdb hello  # 進入除錯模式

3. 指定 C 標準

不同的 C 標準可能會影響編譯結果,你可以使用 -std= 選擇版本:

gcc -std=c99 hello.c -o hello  # 使用 C99
gcc -std=c11 hello.c -o hello  # 使用 C11

C++ 也有對應的標準:

g++ -std=c++11 hello.cpp -o hello  # 使用 C++11
g++ -std=c++17 hello.cpp -o hello  # 使用 C++17
g++ -std=c++20 hello.cpp -o hello  # 使用 C++20

4. 多檔案編譯

在大型專案中,通常會將程式拆分為多個檔案。例如,假設我們有兩個檔案:

main.c

#include <stdio.h>
#include "math_utils.h"

int main() {
    printf("2 + 3 = %d\n", add(2, 3));
    return 0;
}

math_utils.c

int add(int a, int b) {
    return a + b;
}

math_utils.h

#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);

#endif

編譯與連結

先分別編譯 main.cmath_utils.c 產生 .o 檔案(物件檔):

gcc -c main.c -o main.o
gcc -c math_utils.c -o math_utils.o

再將兩個物件檔連結成最終的執行檔:

gcc main.o math_utils.o -o program

執行程式:

./program

5. 產生靜態與動態函式庫

在大型專案中,可以將常用功能打包成函式庫,讓其他程式使用。

1. 建立靜態函式庫(.a)

ar rcs libmath.a math_utils.o

使用靜態函式庫:

gcc main.c -L. -lmath -o program

2. 建立動態函式庫(.so)

gcc -shared -o libmath.so math_utils.o

使用動態函式庫:

gcc main.c -L. -lmath -o program
export LD_LIBRARY_PATH=.
./program

結論

GCC 是 C/C++ 開發者最重要的工具之一,掌握基本指令可以幫助你更有效率地編譯與管理程式碼。

GCC 指令速查

編譯 C 程式

gcc hello.c -o hello

編譯 C++ 程式

g++ hello.cpp -o hello

最佳化編譯

gcc -O2 hello.c -o hello

啟用警告

gcc -Wall hello.c -o hello

除錯模式

gcc -g hello.c -o hello

多檔案編譯

gcc main.c math_utils.c -o program

學會 GCC,你就能掌控 C/C++ 的編譯流程,提高開發效率!?

你最常使用哪些 GCC 指令?歡迎留言分享!

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論