簡體   English   中英

g++和gcc有什么區別?

[英]What is the difference between g++ and gcc?

g++和gcc有什么區別? 其中哪一個應該用於一般的 c++ 開發?

gccg++是 GNU Compiler Collection (曾是 GNU C Compiler )的編譯器驅動程序。

即使它們根據文件類型自動確定要調用的后端( cc1 cc1plus ...),除非用-x language覆蓋,它們還是有一些區別。

它們的默認值可能最重要的區別是它們自動鏈接到哪些庫。

根據 GCC 的在線文檔鏈接選項g++ 的調用方式g++相當於gcc -xc++ -lstdc++ -shared-libgcc (第一個是編譯器選項,第二個是鏈接器選項)。 這可以通過使用-v選項同時運行來檢查(它顯示正在運行的后端工具鏈命令)。

GCC:GNU 編譯器集合

  • GNU 編譯器支持的所有不同語言的引用。

gcc : GNU C 編譯器
g++ :GNU C++ 編譯器

主要區別:

  1. gcc將編譯: *.c\*.cpp文件分別為 C 和 C++。
  2. g++將編譯: *.c\*.cpp文件,但它們都將被視為 C++ 文件。
  3. 此外,如果您使用g++鏈接目標文件,它會自動鏈接到 std C++ 庫( gcc不這樣做)。
  4. gcc編譯 C 文件的預定義宏較少。
  5. gcc編譯*.cppg++編譯*.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++ 編譯器。 gnatgcc的 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手冊頁以獲取有關gccg++之間選項差異的更多詳細信息。

哪一個應該用於一般的 c++ 開發?

從技術上講, gccg++都可用於具有適用選項設置的一般 C++ 開發。 但是, g++默認行為自然與 C++ 開發保持一致。

添加了Ubuntu 18.04 'gcc' 手冊頁,並且Ubuntu 20.04繼續具有以下段落:

運行 GCC 的常用方法是運行名為gcc的可執行文件,或在交叉編譯時運行 machine machine-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++ 開發。

我對這個問題產生了興趣並進行了一些實驗

  1. 我在這里找到了該描述,但它很短。

  2. 然后我嘗試在我的 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
  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
  4. 但是當我嘗試以這種方式運行“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]
  5. 但是這個仍然可以正常工作

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. 而這也

    $ 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;
}

發現:

  1. 如果查看進程樹,那么 gcc 和 g++ 似乎是其他工具的后端,在我的環境中是: cc1plus.exe、cc1.exe、collect2.exe、as.exe、ld.exe

  2. 如果您有正確的擴展名或設置正確的 -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM