在 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 需要安裝 MinGW 或 MSYS2 來獲取 GCC,推薦使用 MSYS2:
- 下載 MSYS2:https://www.msys2.org/
- 在 MSYS2 終端輸入以下指令安裝 GCC:
pacman -S mingw-w64-ucrt-x86_64-gcc - 確認安裝成功:
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.c 和 math_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 指令?歡迎留言分享!
評論