HelloWorld: main.o print.o
g++ -o HelloWorld print.o main.o
main.o: main.cpp print.h
g++ -o main.o main.cpp # 錯誤:產生可執行文件而非目標文件
print.o: print.cpp print.h
g++ -o print.o print.cpp
g++ -o main.o main.cpp 企圖直接生成可執行文件 `main.o`,但 `main.cpp` 包含 `main()`,缺少 `print()` 定義,鏈接失敗報 undefined reference to 'main' (實際是 `print` 未定義)。
-c:僅編譯生成目標文件 .o,**不鏈接**。-o:指定輸出文件名。CXX = g++
CXXFLAGS = -Wall -std=c++11
HelloWorld: main.o print.o
$(CXX) -o HelloWorld main.o print.o
main.o: main.cpp print.h
$(CXX) $(CXXFLAGS) -c -o main.o main.cpp
print.o: print.cpp print.h
$(CXX) $(CXXFLAGS) -c -o print.o print.cpp
.PHONY: clean
clean:
rm -f *.o HelloWorld
**編譯 (-c) 與鏈接 分離**,目標文件 `.o` 只包含編譯單元符號,最終鏈接階段解析所有符號生成可執行文件。