gcc 和 g++ 的聯絡和區別,使用 gcc 編譯 c++
GCC
編譯器已經為我們提供了呼叫它的介面,對於 C
語言或者 C++
程式,可以通過執行 gcc
或者 g++
指令來呼叫 GCC
編譯器。
實際使用中我們更習慣使用 gcc
指令編譯 C 語言程式,用 g++
指令編譯 C++
程式碼。需要強調的一點是,這並不是 gcc
和 g++
的區別,gcc
指令也可以用來編譯 C++
程式,同樣 g++
指令也可以用於編譯 C
語言程式。
實際上,只要是 GCC
支援編譯的程式程式碼,都可以使用 gcc
命令完成編譯。可以這樣理解,gcc
是 GCC
編譯器的通用編譯指令,因為根據程式檔案的字尾名,gcc
指令可以自行判斷出當前程式所用程式語言的類別,比如:
xxx.c
:預設以編譯C
語言程式的方式編譯此檔案xxx.cpp
:預設以編譯C++
程式的方式編譯此檔案xxx.m
:預設以編譯Objective-C
程式的方式編譯此檔案xxx.go
:預設以編譯Go
語言程式的方式編譯此檔案
當然,gcc
指令也為使用者提供了 “手動指定代表編譯方式” 的介面,即使用 -x
選項:
gcc -xc xxx
表示以編譯C
語言程式碼的方式編譯 xxx 檔案gcc -xc++ xxx
則表示以編譯C++
程式碼的方式編譯 xxx 檔案
但如果使用 g++
指令,則無論目標檔案的字尾名是什麼,該指令都一律按照編譯 C++
程式碼的方式編譯該檔案。也就是說,
- 對於
.c
檔案來說,gcc
指令以C
語言程式碼對待,g++
指令會以C++
程式碼對待。 - 但對於
.cpp
檔案來說,gcc
和g++
都會以C++
程式碼的方式編譯。
C++
標準對程式碼書寫規範的要求更加嚴格。
除此之外對於編譯執行 C++
程式,使用 gcc
和 g++
也是有區別的。要知道,很多 C++
程式都會呼叫某些標準庫中現有的函式或者類物件,而單純的 gcc
命令是無法自動連結這些標準庫檔案的。舉個例子:
//test.cpp
#include <iostream>
#include <string>
using namespace std;
int main(){
string str ="hello,world";
cout << str << endl;
return 0;
}
這是一段很簡單的 C++
程式,其通過 <string>
標頭檔案提供的 string
字串類定義了一個字串物件,隨後使用 cout
輸出流物件將其輸出。對於這段 C++
程式碼,如果我們使用 g++
指令編譯,如下所示:
[wohu@ubuntu~]$ g++ test.cpp
[wohu@ubuntu~]$
可以看到,整個編譯過程沒有報任何錯誤。但如果使用 gcc
指令:
[wohu@ubuntu~]$ gcc test.cpp
/tmp/ccluIPFx.o: In function `main':
test.cpp:(.text+0x20): undefined reference to `std::allocator<char>::allocator()'
....
/tmp/ccluIPFx.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
collect2: error: ld returned 1 exit status
其根本原因就在於,該程式中使用了標準庫 <iostream>
和 <string>
提供的類物件,而 gcc
預設是無法找到它們的。
如果想使用 gcc
指令來編譯執行 C++
程式,需要在使用 gcc
指令時,手動為其新增 -lstdc++
選項,表示 gcc
在編譯 C++
程式時可以連結必要的 C++
標準庫。如下示例:
[wohu@ubuntu~]$ gcc test.cpp -lstdc++
[wohu@ubuntu~]$
由此,test.cpp 就被成功的編譯了。
對於 gcc
和 g++
指令,還有其它更多細節方面的區別,當前只需要知道:
- 對於
C
語言程式的編譯,我們應該使用gcc
指令 - 編譯
C++
程式則推薦使用g++
指令
這就足夠了。
相關文章
- 【知識點】 gcc和g++的聯絡和區別GC
- gcc 和 g++ 的區別GC
- g++ 和 gcc 的相同點和區別GC
- gcc與g++的區別GC
- gcc g++支援C++11 標準編譯及其區別GCC++編譯
- linux下gcc/g++編譯用法LinuxGC編譯
- 用ccache加速你的gcc/g++編譯(轉)GC編譯
- GCC編譯器的使用GC編譯
- Linux下修改gcc和g++的版本LinuxGC
- GCC編譯和連結過程GC編譯
- gcc編譯GC編譯
- GCC/G++學習筆記 - 1 - 執行預編譯GC筆記編譯
- 關於gcc、make和CMake的區別GC
- GCC 使用指南及gcc最佳編譯引數(轉)GC編譯
- GCC 內聯彙編GC
- C/C++引用和指標的聯絡和區別C++指標
- GCC編譯選項GC編譯
- GCC 編譯選項GC編譯
- CentOS7編譯和安裝GCC7.5CentOS編譯GC
- linux下gcc/g++命令LinuxGC
- linux下的gcc編譯LinuxGC編譯
- gcc編譯cpp檔案GC編譯
- 開源編譯器 GCC 跨越 5.0,釋出 GCC 5.1編譯GC
- gcc 編譯器與 clang 編譯器GC編譯
- gcc或g++的編譯選項 -shared -fPIC 與 -g -rdynamic 部分轉載GC編譯
- ubuntu 20.04安裝GCC G++ 6.2,支援c++ 14UbuntuGCC++
- tcp/ip和http的區別和聯絡TCPHTTP
- orcle pfile和spfile的區別和聯絡
- NET|Ref 和out 的區別和聯絡
- Instruction和Question的區別和聯絡Struct
- GCC編譯器背後的故事GC編譯
- Linux中gcc編譯工具LinuxGC編譯
- gcc 編譯多個原始檔GC編譯
- gcc最佳編譯引數(轉)GC編譯
- 安裝 GCC 編譯器(轉)GC編譯
- GCC內聯彙編(2)GCC生成彙編程式碼簡單例項GC單例
- 32位支援:使用 GCC 交叉編譯GC編譯
- Notepad++編譯和執行C語言 (GCC)編譯C語言GC