[英]What is the difference between g++ and gcc?
g++和gcc有什么區別? 其中哪一個應該用於一般的 c++ 開發?
GCC:GNU 編譯器集合
gcc
: GNU C 編譯器
g++
:GNU C++ 編譯器
主要區別:
gcc
將編譯: *.c\*.cpp
文件分別為 C 和 C++。g++
將編譯: *.c\*.cpp
文件,但它們都將被視為 C++ 文件。g++
鏈接目標文件,它會自動鏈接到 std C++ 庫( gcc
不這樣做)。gcc
編譯 C 文件的預定義宏較少。gcc
編譯*.cpp
和g++
編譯*.c\*.cpp
文件有一些額外的宏。 編譯*.cpp
文件時的額外宏:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
對於 c++,你應該使用 g++。
它是同一個編譯器(例如 GNU 編譯器集合)。 GCC 或 G++ 只是選擇具有不同默認選項的不同前端。
簡而言之:如果你使用 g++,前端會告訴鏈接器你可能想鏈接 C++ 標准庫。 gcc 前端不會這樣做(如果您傳遞正確的命令行選項,它也可以與它們鏈接)。
g++
和gcc
有什么區別?
gcc
已經從單一語言“GNU C 編譯器”演變為多語言“GNU 編譯器集合”。 在 C 編程的上下文中,術語gcc
有時可能仍指代“GNU C 編譯器”。
man gcc
# GCC(1) GNU
#
# NAME
# gcc - GNU project C and C++ compiler
但是, g++
是GNU Compiler Collection 的 C++ 編譯器。 像gnat
是gcc
的 Ada 編譯器。 請參閱使用 GNU 編譯器集合 (GCC)
例如,Ubuntu 16.04 和 18.04 man g++
命令返回GCC(1)
手冊頁。
Ubuntu 16.04 和 18.04 的man gcc
聲明...
g++
接受與gcc
幾乎相同的選項
並且默認...
... 使用
gcc
不會添加 C++ 庫。g++
是一個調用 GCC 並自動指定與 C++ 庫的鏈接的程序。 除非使用 -x,否則它將 .c、.h 和 .i 文件視為 C++ 源文件而不是 C 源文件。 在預編譯擴展名為 .h 的 C 頭文件以用於 C++ 編譯時,此程序也很有用。
搜索gcc
手冊頁以獲取有關gcc
和g++
之間選項差異的更多詳細信息。
哪一個應該用於一般的 c++ 開發?
從技術上講, gcc
或g++
都可用於具有適用選項設置的一般 C++ 開發。 但是, g++
默認行為自然與 C++ 開發保持一致。
添加了Ubuntu 18.04 'gcc' 手冊頁,並且Ubuntu 20.04繼續具有以下段落:
運行 GCC 的常用方法是運行名為
gcc
的可執行文件,或在交叉編譯時運行 machinemachine-gcc
gcc,或運行特定版本的 GCC 的machine-gcc-version
。 當你編譯 C++ 程序時,你應該把 GCC 作為g++
來調用。
旁注:在 Xcode.app 嵌入式工具鏈的情況下, g++
只是鏈接到gcc
。 因此, g++
調用可能因每個工具鏈而異。
ls -l /Applications/Xcode.app/Contents/Developer/usr/bin
# …
# lrwxr-xr-x 1 root wheel 3 Apr 27 2021 g++ -> gcc
# -rwxr-xr-x 1 root wheel 167120 Nov 23 20:51 gcc
### -- versus --
which -a g++
# /usr/bin/g++
ls -l /usr/bin/g++
# -rwxr-xr-x 1 root wheel 137616 Jan 1 2020 /usr/bin/g++
一個顯着的區別是,如果您將.c
文件傳遞給 gcc,它將編譯為 C。
g++ 的默認行為是將.c
文件視為 C++(除非指定-xc
)。
盡管 gcc 和 g++ 命令做的事情非常相似,但 g++ 被設計為您在編譯 C++ 程序時調用的命令。 它旨在自動做正確的事情。
在幕后,它們實際上是同一個程序。 據我了解,兩者都根據文件擴展名決定將程序編譯為 C 還是 C++。 兩者都能夠鏈接到 C++ 標准庫,但默認情況下只有 g++ 這樣做。 因此,如果您有一個用 C++ 編寫的程序,並且碰巧不需要鏈接到標准庫,那么 gcc 會碰巧做正確的事情; 但是,g++ 也會如此。 所以真的沒有理由不使用 g++ 進行一般的 C++ 開發。
我對這個問題產生了興趣並進行了一些實驗
我在這里找到了該描述,但它很短。
然后我嘗試在我的 Windows 機器上嘗試 gcc.exe 和 g++.exe:
$ g++ --version | head -n1 g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3 $ gcc --version | head -n1 gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
我嘗試編譯 c89、c99 和 c++1998 簡單測試文件,並且它對我來說工作得很好,具有與語言匹配的正確擴展名
gcc -std=c99 test_c99.c gcc -std=c89 test_c89.c g++ -std=c++98 test_cpp.cpp gcc -std=c++98 test_cpp.cpp
但是當我嘗試以這種方式運行“gnu 編譯器集合”工具時:
$ gcc -std=c++98 test_cpp.c cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
但是這個仍然可以正常工作
$ gcc -x c++ -std=c++98 test_cpp.c
而這也
$ g++ -std=c++0x test_cpp_11.cpp
ps 測試文件
$ cat test_c89.c test_c99.c test_cpp.cpp
// C89 compatible file
int main()
{
int x[] = {0, 2};
return sizeof(x);
}
// C99 compatible file
int main()
{
int x[] = {[1]=2};
return sizeof(x);
}
// C++1998,2003 compatible file
class X{};
int main()
{
X x;
return sizeof(x);
}
// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
std::vector<int> a {1,2,3}; // bracket initialization
return 0;
}
發現:
如果查看進程樹,那么 gcc 和 g++ 似乎是其他工具的后端,在我的環境中是: cc1plus.exe、cc1.exe、collect2.exe、as.exe、ld.exe
如果您有正確的擴展名或設置正確的 -std -x 標志,gcc 可以作為元工具正常工作。 看到這個
“GCC”是 GNU 編譯器集合的常用縮寫詞。 這既是編譯器的最通用名稱,也是強調編譯 C 程序時使用的名稱(以前的縮寫代表“GNU C Compiler”)。
在提到 C++ 編譯時,通常將編譯器稱為“G++”。 由於只有一個編譯器,因此無論在何種語言環境下,將其稱為“GCC”也是准確的; 但是,當重點是編譯 C++ 程序時,術語“G++”更有用。
你可以在這里閱讀更多。
我在 linux 系統中測試 gcc 和 g++。 通過使用 MAKEFILE,我可以定義“GNU make”使用的編譯器。 我使用“C plus plus”的所謂“動態內存”定位功能進行了測試:
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}
我的電腦上只有g++可以編譯成功,而gcc會報錯
undefined reference to `operator new(unsigned long)'
所以我自己的結論是gcc並不完全支持“C plus plus”。 似乎為 C++ 源文件選擇 g++ 是一個更好的選擇。
gcc 和 g++ 都是 GNU 編譯器。 他們都編譯c和c++。 不同之處在於 *.c 文件 gcc 將其視為 ac 程序,而 g++ 將其視為 ac ++ 程序。 *.cpp 文件被認為是 c++ 程序。 c++是c的超集,語法比較嚴格,所以要注意后綴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.