參考網易博客者“靜心”的博客——《gcc與g++的區別》結合自己的認識做出的個人領悟。(由於個人水平有限,難免會存在錯誤的地方,請見諒)
一般而言,在Linux下編譯程序分爲以下4個階段:
- 預處理:編譯處理宏定義等宏命令(eg:#define)——生成後綴爲“.i”的文件
- 編譯:將預處理後的文件轉換成彙編語言——生成後綴爲“.s”的文件
- 彙編:由彙編生成的文件翻譯爲二進制目標文件——生成後綴爲“.o”的文件
- 連接:多個目標文件(二進制)結合庫函數等綜合成的能直接獨立執行的執行文件——生成後綴爲“.out”的文件
- 後綴爲.c的,gcc把它當作是C程序(cc/cpp才判定爲C++源程序),而g++當作是c++程序
- gcc無法進行庫文件的連接,即無法編譯完成步驟4;而g++則能完整編譯出可執行文件。(實質上,g++從步驟1-步驟3均是調用gcc完成,步驟4連接則由自己完成)
- gcc -E 執行到步驟1,只處理宏命令,需要用重定向生成文件
- gcc -S 執行到步驟2,生成文件.s
- gcc -c 執行到步驟3,生成文件.o
- g++ 分別編譯於連接 .cc文件與.o文件
#include <iostream>
using namespace std;
int main()
{
cout<<"This is a C++ program."<<endl;
}
測試結果:gcc -E 1.cc >> 1.i
vi 1.i
gcc -S 1.cc
vi 1.s
gcc -c 1.cc
g++ 1.o -o from_o
運行結果:
g++ 1.cc -o from_cc
運行結果:
gcc 1.cc