g ++とgccの違いは何ですか?


回答:


727

gccまたg++、GNUコンパイラコレクションのコンパイラドライバです(これはかつて、GNU Cコンパイラだけでした)。

cc1 cc1plusファイルタイプに応じて、呼び出すバックエンド(...)を自動的に決定しますが-x language、でオーバーライドしない限り、いくつかの違いがあります。

デフォルトでおそらく最も重要な違いは、自動的にリンクするライブラリです。

GCCのオンラインドキュメントリンクオプションg ++の呼び出し方法によれば、g++と同等ですgcc -xc++ -lstdc++ -shared-libgcc(1つ目はコンパイラーオプション、2つ目はリンカーオプションです)。これは、両方の-vオプションを実行して確認できます(実行中のバックエンドツールチェーンコマンドが表示されます)。


13
この回答から、私は事実上、g ++コマンドはフラグの束を持つ単なるgccであると結論づけています。1つのバイナリと1つのシンボリックリンク(またはそれらの行に沿った何か)があるべきではありませんか?
UchihaItachi

9
@Uchihaltachiこれらのファイルはハードリンクであり、起動時に、argv[0]どの呼び出しを使用するかを確認します。これは、コアUNIXユーティリティではかなり一般的です。
レリッシュ

438

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コンパイル*.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

37
パラメータgccを渡す-lstdc++ことでstd C ++ライブラリをリンクできます。
DenilsonSáMaia 2010

16
'gcc'と 'g ++'の違いは標準ライブラリだけではgcc -lstdc++ないため、と同じ動作は得られませんg++。その言語固有の動作をすべて独自のドライバーに組み込んだのには理由があります。:-)
Ti Strga 2013年

8
私のコメントは単にリンクについて話しているのではありません...それがポイントです。ディスカッションをリンクに制限するだけでも(あなたの答えはそうではありませんでした)、数学、RTTI、例外情報への依存関係が欠落しているため、ユーザーを指定するだけではC ++標準ライブラリ全体を使用できません-lstdc++。特定のテストケースがリンクするか失敗するかは、オペレーティングシステムとテストケースで使用されるC ++機能に依存します。これも、ユーザーに任せずにすべての知識がg ++ドライバーに組み込まれている理由です。 。
Ti Strga 2013年

10
私を信じて、私たちはこの議論をたくさんしています。通常、Linuxユーザーが彼の不完全なMakefileを別のプラットフォームに移動しようとするときです。:-) g ++リンクステージはgcc -lstdc++、特にターゲットが組み込みプラットフォームである場合、他のOS よりも多くのことを行います。幸いなことに、そもそもg ++を出荷するのはそのためです。
Ti Strga 2013年

10
スペック文字列はコンパイラに固有に構築され、コンパイラはオペレーティングシステムとターゲットに固有です。したがって-dumpspec、たとえば、組み込みシステムをターゲットとするクロスコンパイラーで実行すると、違いがわかります。リンカの違いだけではありません...これもまた、あなたの答えでした(プリプロセッサマクロ、インクルードパス、複数のランタイムライブラリ)。私たちは互いに過去を話し合っているようですが、前のGCCメンテナーとして、私はフロントエンドが何であるか、そしてそうでないかを知っていることをあなたに保証します。
Ti Strga 2013年

82

c ++の場合は、g ++を使用する必要があります。

これは同じコンパイラです(たとえば、GNUコンパイラコレクション)。GCCまたはG ++は、デフォルトのオプションが異なる別のフロントエンドを選択するだけです。

簡単に言えば、g ++を使用している場合、フロントエンドはC ++標準ライブラリとリンクすることをリンカーに指示します。gccフロントエンドはこれを行いません(適切なコマンドラインオプションを渡した場合、リンクすることもできます)。


3
+1また、私のGNU / Linux gccのマニュアルページには、「C ++プログラムをコンパイルするときは、代わりにGCCをg ++として呼び出す必要があります」と記載されています。
楕円形ビュー

35

違いは何であるg++とはgcc

gccは、単一言語「GNU Cコンパイラ」から多言語「GNUコンパイラコレクション」に進化しました。「GNU Cコンパイラ」という用語は、Cプログラミングのコンテキストで時々使用されます。

g++ ある GNUコンパイラコレクションのためのC ++コンパイラ。のようなgnatAdaコンパイラですgccGNUコンパイラコレクション(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 ++ソースファイルとして扱います。このプログラムは、Cヘッダーファイルを.h拡張子でC ++コンパイルで使用するようにプリコンパイルする場合にも役立ちます。

とのgcc間のオプションの差異の詳細については、manページを検索してください。 gccg++

一般的なc ++開発に使用すべきものはどれですか?

技術的には、いずれかgccまたはg++該当するオプションの設定で、一般的なC ++開発のために使用することができます。ただし、g++デフォルトの動作は自然にC ++開発に合わせられます。

Ubuntuの18.04 manページには、次の段落を追加しました:

GCCを実行する通常の方法は、と呼ばれる実行可能ファイルを実行するgccmachine-gcc、クロスコンパイルするかmachine-gcc-version、特定のバージョンのGCCを実行することです。 C ++プログラムをコンパイルするときは、g++代わりにGCCを呼び出す必要があります。


21

注目すべき違いの1つは、.cファイルをgccに渡すと、Cとしてコンパイルされることです。

g ++のデフォルトの動作は、.cファイルがC ++として扱われることです(-x c指定されていない場合)。


19
(後期だが後世のため)他の回答が指摘しているように、読者が注目度の歪んだ定義を持たない限り、これは決して「唯一の注目すべき違い」ではありません。
underscore_d

16

gccコマンドとg ++コマンドは非常によく似ていますが、g ++はC ++プログラムをコンパイルするために呼び出すコマンドとして設計されています。自動的に正しいことを行うことを目的としています。

舞台裏では、彼らは本当に同じプログラムです。私が理解しているように、どちらもファイル名拡張子に基づいてプログラムをCとしてコンパイルするか、C ++としてコンパイルするかを決定します。どちらもC ++標準ライブラリに対してリンクできますが、デフォルトではこれを行うのはg ++だけです。したがって、C ++で書かれたプログラムで、たまたま標準ライブラリにリンクする必要がないプログラムがある場合、gccはたまたま正しいことをします。しかし、そうすると、g ++もそうなります。したがって、一般的なC ++開発でg ++を使用しない理由は本当にありません。


12

問題に興味を持ち、いくつかの実験を行いました

  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はmetatoolとして正常に機能します。これを


9

「GCC」は、GNUコンパイラコレクションの一般的な省略表現です。これは、コンパイラーの最も一般的な名前であり、Cプログラムのコンパイルに重点が置かれている場合に使用される名前でもあります(以前の略称は「GNU Cコンパイラー」の略でした)。

C ++コンパイルを参照する場合、通常はコンパイラー「G ++」を呼び出します。コンパイラは1つしかないため、言語のコンテキストに関係なく「GCC」と呼ぶのも正確です。ただし、「G ++」という用語は、C ++プログラムのコンパイルに重点が置かれている場合により役立ちます。

ここでもっと読むことができます


0

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 ++を選択する方が良いオプションのようです。


次の2つの作業を行う必要があります。1.言語を選択する2. libstdc ++としていくつかのライブラリを選択する
PersianGulf

-1

gccとg ++はどちらもGNUコンパイラです。どちらもcとc ++をコンパイルします。違いは、*。cファイルの場合です。gccはそれをacプログラムとして扱い、g ++はそれをac ++プログラムとして認識します。* .cppファイルは、C ++プログラムと見なされます。c ++はcのスーパーセットであり、構文はより厳密であるため、接尾辞に注意してください。


1
C ++は別の言語であり、Cの厳密なスーパーセットではないため、間違ったターゲット言語でコンパイルすると、予期しない結果が生じる可能性があります。また、C ++のみのファイル名拡張子としてg++解釈さ.ccれることにも注意してください。
underscore_d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.