Linux 下 gcc 與 g++的差別

參考網易博客者“靜心”的博客——《gcc與g++的區別》結合自己的認識做出的個人領悟。(由於個人水平有限,難免會存在錯誤的地方,請見諒)

一般而言,在Linux下編譯程序分爲以下4個階段:

  1. 預處理:編譯處理宏定義等宏命令(eg:#define)——生成後綴爲“.i”的文件    
  2. 編譯:將預處理後的文件轉換成彙編語言——生成後綴爲“.s”的文件    
  3. 彙編:由彙編生成的文件翻譯爲二進制目標文件——生成後綴爲“.o”的文件    
  4. 連接:多個目標文件(二進制)結合庫函數等綜合成的能直接獨立執行的執行文件——生成後綴爲“.out”的文件
在Linux下執行gcc與g++編譯C++文件的差別:
  1. 後綴爲.c的,gcc把它當作是C程序(cc/cpp才判定爲C++源程序),而g++當作是c++程序
  2. gcc無法進行庫文件的連接,即無法編譯完成步驟4;而g++則能完整編譯出可執行文件。(實質上,g++從步驟1-步驟3均是調用gcc完成,步驟4連接則由自己完成)
下面進行一次簡單的測試:
測試環境:CentOS 6.4
測試命令:
  1. gcc -E 執行到步驟1,只處理宏命令,需要用重定向生成文件
  2. gcc -S 執行到步驟2,生成文件.s
  3. gcc -c 執行到步驟3,生成文件.o
  4. 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 與直接g++ 1.cc的結果:
g++ 1.o -o from_o

運行結果:


g++ 1.cc -o from_cc

運行結果:


若直接用gcc編譯鏈接c++文件會出錯,因無法鏈接。
gcc 1.cc


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章