1. 程式人生 > >gcc g++區別與聯絡

gcc g++區別與聯絡

編譯階段是相同的,連結階段g++預設連結c++庫,gcc沒有。
所以一般情況下用gcc編譯c檔案,用g++編譯cpp檔案。
但是也可以用gcc編譯cpp檔案,但後面需要加一個選項-lstdc++,作用是連結c++庫
還可以用g++編譯c檔案

一般而言,在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檔案
測試程式碼: [cpp]
view plain copy print?
  1. #include <iostream>
  2. usingnamespace std;  
  3. int main()  
  4. {  
  5.     cout<<"This is a C++ program."<<endl;  
  6. }  
#include <iostream>
using namespace std;
int main()
{
    cout<<"This is a C++ program."<<endl;
}
測試結果: [cpp] view plain copy print
?
  1. gcc -E 1.cc >> 1.i  
gcc -E 1.cc >> 1.i

[cpp] view plain copy print?
  1. vi 1.i  
vi 1.i

[cpp] view plain copy print?
  1. gcc -S 1.cc  
gcc -S 1.cc

[cpp] view plain copy print?
  1. vi 1.s  
vi 1.s


[cpp] view plain copy print?
  1. gcc -c 1.cc  
gcc -c 1.cc


接下來測試g++ 1.o 與直接g++ 1.cc的結果: [cpp] view plain copy print?
  1. g++ 1.o -o from_o  
g++ 1.o -o from_o

執行結果:
[cpp] view plain copy print?
  1. g++ 1.cc -o from_cc  
g++ 1.cc -o from_cc

執行結果:
若直接用gcc編譯連結c++檔案會出錯,因無法連結。 [cpp] view plain copy print?
  1. gcc 1.cc  
gcc 1.cc