gcc g++區別與聯絡
阿新 • • 發佈:2019-01-02
編譯階段是相同的,連結階段g++預設連結c++庫,gcc沒有。
所以一般情況下用gcc編譯c檔案,用g++編譯cpp檔案。
但是也可以用gcc編譯cpp檔案,但後面需要加一個選項-lstdc++,作用是連結c++庫
還可以用g++編譯c檔案一般而言,在Linux下編譯程式分為以下4個階段:
view plain
copy
print?
?
[cpp] view plain copy print?
[cpp] view plain copy print?
[cpp] view plain copy print?
[cpp] view plain copy print?
接下來測試g++ 1.o 與直接g++ 1.cc的結果: [cpp] view plain copy print?
執行結果:
[cpp] view plain copy print?
執行結果:
若直接用gcc編譯連結c++檔案會出錯,因無法連結。 [cpp] view plain copy print?
所以一般情況下用gcc編譯c檔案,用g++編譯cpp檔案。
但是也可以用gcc編譯cpp檔案,但後面需要加一個選項-lstdc++,作用是連結c++庫
還可以用g++編譯c檔案
一般而言,在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>
- usingnamespace std;
- int main()
- {
- cout<<"This is a C++ program."<<endl;
- }
#include <iostream>
using namespace std;
int main()
{
cout<<"This is a C++ program."<<endl;
}
測試結果:
[cpp]
view plain
copy
print- gcc -E 1.cc >> 1.i
gcc -E 1.cc >> 1.i
[cpp] view plain copy print?
- vi 1.i
vi 1.i
[cpp] view plain copy print?
- gcc -S 1.cc
gcc -S 1.cc
[cpp] view plain copy print?
- vi 1.s
vi 1.s
[cpp] view plain copy print?
- gcc -c 1.cc
gcc -c 1.cc
接下來測試g++ 1.o 與直接g++ 1.cc的結果: [cpp] view plain copy print?
- g++ 1.o -o from_o
g++ 1.o -o from_o
執行結果:
[cpp] view plain copy print?
- g++ 1.cc -o from_cc
g++ 1.cc -o from_cc
執行結果:
若直接用gcc編譯連結c++檔案會出錯,因無法連結。 [cpp] view plain copy print?
- gcc 1.cc
gcc 1.cc