C++ 專案通常包含:標頭檔、實作檔、主程式檔。編譯流程分為前置處理 → 編譯 → 組譯 → 連結四階段。
#include 展開至 .cpp。g++ main.cpp utils.cpp -o myapp -std=c++17 -Wall -O2
等同於:
g++ -c main.cpp -o main.o
g++ -c utils.cpp -o utils.o
g++ main.o utils.o -o myapp
CXX = g++
CXXFLAGS = -std=c++17 -Wall -O2
TARGET = myapp
SRCS = main.cpp utils.cpp
OBJS = $(SRCS:.cpp=.o)
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(OBJS) -o $@
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
| 錯誤 | 原因 | 解決 |
|---|---|---|
| undefined reference | 宣告未實作、連結順序錯、遺漏 .cpp | 檢查實作、調整連結順序、補齊 SRCS |
| multiple definition | 標頭檔含非 inline 定義、重複包含 | 加 include guard、移至 .cpp、用 inline |
| header not found | -I 路徑缺失 | 加 -I./include |
g++ -x c++-header common.h -o common.h.gch
# 後續編譯自動使用
適用於大型專案常用標頭(如 <vector>, <string>, 自訂通用標頭)。