gccを使用したC ++プログラムのコンパイル


84

質問:gccコンパイラでC ++プログラムをコンパイルする方法は?

info.c:

#include<iostream>
using std::cout;
using std::endl;
int main()
{
   #ifdef __cplusplus
   cout << "C++ compiler in use and version is " << __cplusplus << endl;
   #endif
   cout <<"Version is " << __STDC_VERSION__ << endl;
   cout << "Hi" << __FILE__ << __LINE__ << endl;
}

そして私がコンパイルしようとすると info.c

$ gcc info.C

Undefined                       first referenced
 symbol                             in file
cout                                /var/tmp/ccPxLN2a.o
endl(ostream &)                     /var/tmp/ccPxLN2a.o
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o
ostream::operator<<(int)            /var/tmp/ccPxLN2a.o
ostream::operator<<(long)           /var/tmp/ccPxLN2a.o
ostream::operator<<(char const *)   /var/tmp/ccPxLN2a.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

gccコンパイラはC ++プログラムをコンパイルできませんか?関連する注記として、gccとg ++の違いは何ですか。ありがとう、


回答:


136

gccは実際にはc ++コードを問題なくコンパイルできます。受け取ったエラーはリンカーエラーであり、コンパイラエラーではありません。

コンパイル行を次のように変更すると、次のようになる可能性があります。

gcc info.C -lstdc++

これにより、標準のc ++ライブラリにリンクされ、問題なく動作します。

ただし、生活を楽にしてg ++を使用する必要があります。


編集:

ラップは別の答えへの彼のコメントでそれを最もよく言います:

[...] gccは、ファイル拡張子に基づいて正しいバックエンドコンパイラを選択し(つまり、.cをCとして、.ccをC ++としてコンパイルします)、バイナリをデフォルトで標準のCおよびGCCヘルパーライブラリのみにリンクします。入力言語; g ++は、拡張子に基づいて正しいバックエンドも選択しますが、すべてのCソースを代わりにC ++としてコンパイルし(つまり、.cと.ccの両方をC ++としてコンパイルします)、入力言語に関係なく、リンクステップにlibstdc ++を含めます。


41

コードに.c拡張子を付けると、コンパイラーはそれがC ++ではなくCコードであると見なします。また、C ++コンパイラドライバーはg ++と呼ばれます。gccドライバーを使用すると、標準のC ++ライブラリがデフォルトでリンクされないため、リンカーの問題が発生します。あなたが望んでいるのは:

g++ myprog.cpp

また、コードを移植する必要がなく、一緒に作業する人に嫌われる準備ができていない限り、大文字の.C拡張子の使用を検討しないでください。


@Neil:私が言えることから、g​​ccは.C(大文字の)拡張子をc ++拡張子と見なします。以下は問題なく動作します:gcc test.C -lstdc++ -o testまたはg++ test.C -o test
Evan Teran 2010

3
@Evanはい、もちろんそうです。ただし、大文字と小文字が区別されるすべてのファイル名と同様に、移植性にひどい問題が発生するため、これを使用する必要があるという意味ではありません。C ++ファイルの拡張子は常に.cppである必要があります。これは問題を引き起こさず、すべての一般的なオペレーティングシステムで動作することが保証されています。


12

デフォルトでは、gccはファイル拡張子に基づいて言語を選択しますが、-xオプションを使用して、gccに別の言語バックエンドを選択させることができます。

gcc -x c++

その他のオプションについては、gccのmanページの「出力の種類を制御するオプション」で詳しく説明しています。たとえば、http//linux.die.net/man/1/gccを参照してください(ページでテキストを検索してください-x language)。

この機能は、コードを生成してstdinを介してgccにフィードする場合など、gccがファイル拡張子を使用して言語を推測できない場合に非常に役立ちます。


11

gccとg ++の違いは次のとおりです。

     gcc            |        g++
compiles c source   |   compiles c++ source

gccの代わりにg ++を使用して、c ++ソースをコンパイルします。


16
ここにある他の回答のように、それよりも少し複雑です。gccは、ファイル拡張子に基づいて正しいバックエンドコンパイラを選択し(つまり、.cをCとして、.ccをC ++としてコンパイルします)、入力言語に関係なく、デフォルトで標準のCおよびGCCヘルパーライブラリに対してバイナリをリンクします。g ++は、拡張子に基づいて正しいバックエンドも選択しますが、すべてのCソースを代わりにC ++としてコンパイルし(つまり、.cと.ccの両方をC ++としてコンパイルします)、入力言語に関係なく、リンクステップにlibstdc ++を含めます。
Rup 2010

1
@Rup:正解です。これは基本的に私が答えで言っていたことです。
Evan Teran 2010

1

正しく思い出せば、gccはサフィックスからファイルタイプを決定します。したがって、foo.ccにすると、機能するはずです。

そして、あなたの他の質問に答えるために、それは「gcc」と「g ++」の違いです。gccは、正しいコンパイラを選択するフロントエンドです。


1

それは私にとってうまくいきました。cmdの1行のコード。

まず、gcc(cの場合)またはg ++(c ++の場合)コンパイラがインストールされていることを確認します。

gccタイプのcmdの場合:

gcc --version

g ++タイプのcmd:

g ++ --version

インストールされている場合は、次に進みます。

次に、cmdを使用して.cまたは.cppをコンパイルします

.C構文:

gcc -o exe_filename yourfilename.c

例:

gcc -o myfile myfile.c

ここで、exe_filename(例でmyfile)は、コンパイル後に生成する.exeファイルの名前です(注:ここには拡張子を付けていません)。また、yourfilename.c(例でmyfile.c)は、拡張子が.cのソースファイルです

次に、.cファイルを含むフォルダーに移動します。ここに.exe拡張子の付いたファイルがあります。開くだけです。やあ..

する.cpp構文:

g ++ -o exe_filename yourfilename.cpp

その後のプロセスは.cの場合と同じです。


2
質問は「gccコンパイラでC ++プログラムをコンパイルする方法」でした。「gccコンパイラでCプログラムをコンパイルする方法」または「g ++コンパイラでC ++プログラムをコンパイルする方法」ではありません。
DEVX

ナイスキャッチ!@DevX
RajkumarBansal19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.