g ++とgccの違いは何ですか?それらのうちどれを一般的なC ++開発に使用すべきですか?
g ++とgccの違いは何ですか?それらのうちどれを一般的なC ++開発に使用すべきですか?
回答:
gcc
またg++
、GNUコンパイラコレクションのコンパイラドライバです(これはかつて、GNU Cコンパイラだけでした)。
cc1
cc1plus
ファイルタイプに応じて、呼び出すバックエンド(...)を自動的に決定しますが-x language
、でオーバーライドしない限り、いくつかの違いがあります。
デフォルトでおそらく最も重要な違いは、自動的にリンクするライブラリです。
GCCのオンラインドキュメントリンクオプションとg ++の呼び出し方法によれば、g++
と同等ですgcc -xc++ -lstdc++ -shared-libgcc
(1つ目はコンパイラーオプション、2つ目はリンカーオプションです)。これは、両方の-v
オプションを実行して確認できます(実行中のバックエンドツールチェーンコマンドが表示されます)。
argv[0]
どの呼び出しを使用するかを確認します。これは、コアUNIXユーティリティではかなり一般的です。
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
gcc
を渡す-lstdc++
ことでstd C ++ライブラリをリンクできます。
gcc -lstdc++
ないため、と同じ動作は得られませんg++
。その言語固有の動作をすべて独自のドライバーに組み込んだのには理由があります。:-)
-lstdc++
。特定のテストケースがリンクするか失敗するかは、オペレーティングシステムとテストケースで使用されるC ++機能に依存します。これも、ユーザーに任せずにすべての知識がg ++ドライバーに組み込まれている理由です。 。
gcc -lstdc++
、特にターゲットが組み込みプラットフォームである場合、他のOS よりも多くのことを行います。幸いなことに、そもそもg ++を出荷するのはそのためです。
-dumpspec
、たとえば、組み込みシステムをターゲットとするクロスコンパイラーで実行すると、違いがわかります。リンカの違いだけではありません...これもまた、あなたの答えでした(プリプロセッサマクロ、インクルードパス、複数のランタイムライブラリ)。私たちは互いに過去を話し合っているようですが、前のGCCメンテナーとして、私はフロントエンドが何であるか、そしてそうでないかを知っていることをあなたに保証します。
c ++の場合は、g ++を使用する必要があります。
これは同じコンパイラです(たとえば、GNUコンパイラコレクション)。GCCまたはG ++は、デフォルトのオプションが異なる別のフロントエンドを選択するだけです。
簡単に言えば、g ++を使用している場合、フロントエンドはC ++標準ライブラリとリンクすることをリンカーに指示します。gccフロントエンドはこれを行いません(適切なコマンドラインオプションを渡した場合、リンクすることもできます)。
違いは何であるg++
とはgcc
?
gcc
は、単一言語「GNU Cコンパイラ」から多言語「GNUコンパイラコレクション」に進化しました。「GNU Cコンパイラ」という用語は、Cプログラミングのコンテキストで時々使用されます。
g++
ある GNUコンパイラコレクションのためのC ++コンパイラ。のようなgnat
Adaコンパイラですgcc
。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 ++ソースファイルとして扱います。このプログラムは、Cヘッダーファイルを.h拡張子でC ++コンパイルで使用するようにプリコンパイルする場合にも役立ちます。
とのgcc
間のオプションの差異の詳細については、manページを検索してください。 gcc
g++
一般的なc ++開発に使用すべきものはどれですか?
技術的には、いずれかgcc
またはg++
該当するオプションの設定で、一般的なC ++開発のために使用することができます。ただし、g++
デフォルトの動作は自然にC ++開発に合わせられます。
Ubuntuの18.04 manページには、次の段落を追加しました:
GCCを実行する通常の方法は、と呼ばれる実行可能ファイルを実行する
gcc
かmachine-gcc
、クロスコンパイルするかmachine-gcc-version
、特定のバージョンのGCCを実行することです。 C ++プログラムをコンパイルするときは、g++
代わりにGCCを呼び出す必要があります。
注目すべき違いの1つは、.c
ファイルをgccに渡すと、Cとしてコンパイルされることです。
g ++のデフォルトの動作は、.c
ファイルがC ++として扱われることです(-x c
指定されていない場合)。
gccコマンドとg ++コマンドは非常によく似ていますが、g ++はC ++プログラムをコンパイルするために呼び出すコマンドとして設計されています。自動的に正しいことを行うことを目的としています。
舞台裏では、彼らは本当に同じプログラムです。私が理解しているように、どちらもファイル名拡張子に基づいてプログラムをCとしてコンパイルするか、C ++としてコンパイルするかを決定します。どちらもC ++標準ライブラリに対してリンクできますが、デフォルトではこれを行うのはg ++だけです。したがって、C ++で書かれたプログラムで、たまたま標準ライブラリにリンクする必要がないプログラムがある場合、gccはたまたま正しいことをします。しかし、そうすると、g ++もそうなります。したがって、一般的なC ++開発でg ++を使用しない理由は本当にありません。
問題に興味を持ち、いくつかの実験を行いました
ここでその説明を見つけましたが、非常に短いです。
次に、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」は、GNUコンパイラコレクションの一般的な省略表現です。これは、コンパイラーの最も一般的な名前であり、Cプログラムのコンパイルに重点が置かれている場合に使用される名前でもあります(以前の略称は「GNU Cコンパイラー」の略でした)。
C ++コンパイルを参照する場合、通常はコンパイラー「G ++」を呼び出します。コンパイラは1つしかないため、言語のコンテキストに関係なく「GCC」と呼ぶのも正確です。ただし、「G ++」という用語は、C ++プログラムのコンパイルに重点が置かれている場合により役立ちます。
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のスーパーセットであり、構文はより厳密であるため、接尾辞に注意してください。
g++
解釈さ.cc
れることにも注意してください。