web-dev-qa-db-ja.com

CC、gcc、g ++の違いは?

アセンブリコード生成、利用可能なライブラリ、言語機能などの点でCおよびC++コードをコンパイルするときの3つのコンパイラCC、gcc、g ++の違いは何ですか?

80
vehomzzz

これに対する答えはプラットフォーム固有です。たとえば、Linuxで起こることはSolarisで起こることとは異なります。

簡単な部分(プラットフォーム固有ではないため)は、「gcc」と「g ++」の分離です。

  • gccはGNU GCC(GNU Compiler Collection)のCコンパイラです。
  • g ++は、GCCのGNU C++コンパイラです。

プラットフォーム固有であるため、難しい部分は「CC」(および「cc」)の意味です。

  • Solarisでは、CCは通常、Sun C++コンパイラの名前です。
  • Solarisでは、ccは通常、Sun Cコンパイラの名前です。
  • Linuxでは、存在する場合、CCはおそらくg ++へのリンクです。
  • Linuxでは、ccはgccへのリンクです。

ただし、Solarisでも、ccは/usr/ucbの古いBSDベースのCコンパイラである可能性があります。実際には、通常はインストールされず、失敗するスタブだけが存在し、自己構成ソフトウェアをコンパイルしてインストールしようとする人に大混乱をもたらします。

HP-UXでは、デフォルトの 'cc'は依然として必要に応じてカーネルの再リンクを許可するためにインストールされたK&R専用のCコンパイラであり、標準Cをサポートしないため、現代のソフトウェア作業には使用できません。代替のコンパイラ名を使用する必要があります(「acc」IIRC)。同様に、AIXでは、システムCコンパイラは「xlc」や「xlc32」などの名前を使用します。

古典的に、デフォルトのシステムコンパイラは「cc」と呼ばれ、自己構成ソフトウェアは、他に何を使用すべきかわからない場合、その名前に戻ります。

POSIXは、プログラムc89(元々)およびその後のc99の存在を要求することで、この問題を回避しようと試みました。これらは、ISO/IEC 9899:1989および9899:1999 C標準と互換性のあるコンパイラです。 POSIXが成功したかどうかは疑わしい。


この質問では、機能とライブラリの違いについて質問しています。前と同じように、答えは一部はプラットフォーム固有であり、一部は汎用です。

大きな違いは、CコンパイラとC++コンパイラの間です。 C++コンパイラはC++プログラムを受け入れ、任意のCプログラムをコンパイルしません。 (C++によっても理解されるサブセットでCを記述することは可能ですが、多くのCプログラムは有効なC++プログラムではありません)。同様に、CコンパイラはCプログラムを受け入れ、ほとんどのC++プログラムを拒否します(ほとんどのC++プログラムはCで使用できない構造を使用するため)。

使用可能なライブラリのセットは、言語によって異なります。 C++プログラムは通常、特定のプラットフォームでCライブラリを使用できます。 Cプログラムは通常C++ライブラリを使用できません。そのため、C++にはより多くのライブラリセットが用意されています。

Solarisを使用している場合、CCによって生成されたオブジェクトコードは、g ++によって生成されたオブジェクトコードと互換性がないことに注意してください。これらは、例外処理や名前のマングリング(および名前のマングリングは意図的に互換性のないオブジェクトファイルがリンクされないようにするために異なります!)。つまり、CCでコンパイルされたライブラリを使用する場合は、プログラム全体をCCでコンパイルする必要があります。また、CCでコンパイルされたライブラリとg ++でコンパイルされた別のライブラリを使用する場合は、運が悪いことを意味します。少なくともライブラリの1つを再コンパイルする必要があります。

生成されるアセンブラーの品質に関して、GCC(GNU Compiler Collection)は非常に良い仕事をします。ただし、ネイティブコンパイラの方が少しうまく機能する場合があります。 Intelコンパイラには、GCCでまだ複製されていない、より広範な最適化があります。しかし、どのようなプラットフォームが懸念されているかはわかりませんが、そのようなポンティフィケーションは危険です。

言語機能の点では、コンパイラは一般に現在の標準(C++ 98、C++ 2003、C99)にかなり近いが、通常、標準言語とコンパイラがサポートする言語にはわずかな違いがあります。古いC89標準サポートは、すべてのCコンパイラで基本的に同じ(完全な)です。言語の暗いコーナーには違いがあります。 「未定義の動作」、「システム定義の動作」、および「未指定の動作」を理解する必要があります。未定義の動作を呼び出すと、異なる時間に異なる結果が得られます。また、コンパイラの動作を微調整するための多くのオプション(特にGCC)があります。 GCCにはさまざまな拡張機能があり、コンパイラファミリのみをターゲットにしていることがわかっている場合は、作業が簡単になります。

105

CCは、システムのCコンパイラを参照する環境変数です。それが指すもの(アクセス可能なライブラリなど)はプラットフォームに依存します。多くの場合、/usr/bin/cc、実際のcコンパイラ(ドライバ)。 Linuxプラットフォームでは、CCはほとんど常に/usr/bin/gcc

gccは、GNUコンパイラコレクションです。C、C++、およびその他の言語をコンパイルできます。ファイル拡張子によって言語を決定します。

g++gccのようなドライバーバイナリですが、C++のコンパイル用にいくつかの特別なオプションが設定されています。特に(私の経験では)g++はデフォルトでlibstdc ++をリンクしますが、gccはリンクしません。

22
Managu

Linuxのccという情報を1つだけ追加します。 gccとリンクされています。それを確認するには。 enter image description here

同様に、c ++でも同じことが言えます。

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
3
Uddhav Gautam