また、現在の GCC コンパイラは、Go、Objective-C、Objective-C++、Fortran、Ada、D、BRIG (HSAIL) などのプログラムのコンパイルもサポートしており、GCC 6 以前のバージョンでも Java プログラムのコンパイルをサポートしています。ただし、これは主に GCC コンパイラを使用して C および C++ プログラムをコンパイルおよび実行する方法を説明しているため、GCC コンパイラを使用して他のプログラミング言語をコンパイルする方法については詳しく説明しません。
では、C 言語または C++ コードが編集されていることを前提として、GCC コンパイラーを呼び出してプログラムをコンパイルするにはどうすればよいでしょうか。非常に単純なことですが、GCC コンパイラーはそれを呼び出すためのインターフェースを提供してくれました. C 言語または C++ プログラムの場合、gcc または g++ 命令を実行することで GCC コンパイラーを呼び出すことができます.
実際の使用では、gcc 命令を使用して C 言語プログラムをコンパイルし、g++ 命令を使用して C++ コードをコンパイルすることに慣れていることに注意してください。これは gcc と g++ の違いではないことを強調しておく必要があります。gcc 命令は C++ プログラムのコンパイルにも使用でき、g++ 命令は C 言語プログラムのコンパイルにも使用できます。
では、gcc と g++ の違いは何ですか?次に、読者に詳細な説明をします。
実際、プログラム コードが GCC によってコンパイルされている限り、gcc コマンドを使用してコンパイルを完了することができます。 gcc は GCC コンパイラの一般的なコンパイル命令であることが理解できます。これは、プログラム ファイルのサフィックス名に従って、gcc 命令が現在のプログラムで使用されているプログラミング言語の種類を判別できるためです。たとえば、次のようになります。
- xxx.c: デフォルトで C 言語プログラムをコンパイルして、このファイルをコンパイルします。
- xxx.cpp: デフォルトで C++ プログラムをコンパイルする方法で、このファイルをコンパイルします。
- xxx.m: デフォルトで Objective-C プログラムをコンパイルして、このファイルをコンパイルします。
- xxx.go: デフォルトでは、このファイルは Go 言語プログラムをコンパイルする方法でコンパイルされます。
もちろん、gcc コマンドは、「代表的なコンパイル方法を手動で指定する」、つまり -x オプションを使用するインターフェースもユーザーに提供します。たとえば、gcc -xc xxx は C 言語コードをコンパイルする方法で xxx ファイルをコンパイルすることを意味し、gcc -xc++ xxx は C++ コードをコンパイルする方法で xxx ファイルをコンパイルすることを意味します。 -x オプションの使用方法については、後で具体例を示します。
ただし、g++ コマンドを使用すると、オブジェクト ファイルのサフィックスが何であれ、コマンドは C++ コードをコンパイルするのと同じ方法でファイルをコンパイルします。つまり、.c ファイルの場合、gcc 命令は C 言語コードとして扱われ、g++ 命令は C++ コードとして扱われます。ただし、.cpp ファイルの場合、gcc と g++ の両方が C++ コードとしてコンパイルされます。
C++ は C 言語と互換性があるので、C 言語のプログラムは gcc を使用しても g++ を使用してもコンパイルに違いはないはずですが、そうではありません。厳密に言えば、C++ 標準と C 言語標準の文法要件は異なります。例えば:
//ファイル demo.c
#include <stdio.h>
int main()
{
const char * a = "abc";
printStr(a);
return;
}
int printStr(const char* str)
{
printf(str);
}
上に示したように、これは非標準の C 言語コードです。次のように gcc ディレクティブでコンパイルすると:
[root@bogon ~]# gcc -xc demo.c #または gcc demo.c を直接実行
[root@bogon ~]#
命令の実行中にエラーが発生しなかったことがわかります。同じプログラムを g++ 命令を使用してコンパイルすると、次のようになります。
[root@bogon ~]# g++ demo.c
demo.c: In function ‘int main()’:
demo.c:5: error: ‘printStr’ was not declared in this scope
demo.c:6: error: return-statement with no value, in function returning ‘int’
[root@bogon ~]#
ご覧のとおり、GCC コンパイラは 3 つのエラーを検出しました。明らかに、C++ 標準には、コード記述仕様に関するより厳しい要件があります。
さらに、C++ プログラムのコンパイルと実行に gcc を使用する場合と g++ を使用する場合には違いがあります。多くの C++ プログラムは、標準ライブラリ内の既存の関数またはクラス オブジェクトを呼び出しますが、単純な gcc コマンドではこれらの標準ライブラリ ファイルを自動的にリンクできないことを知っておく必要があります。例えば:
//demo.cpp
#include <iostream>
#include <string>
using namespace std;
int main(){
string str ="IT基礎";
cout << str << endl;
return 0;
}
これは非常に単純な C++ プログラムで、<string> ヘッダー ファイルによって提供される文字列文字列クラスを通じて文字列オブジェクトを定義し、cout 出力ストリーム オブジェクトを使用してそれを出力します。この C++ コードを g++ ディレクティブを使用してコンパイルすると、次のようになります。
[root@bogon ~]# g++ demo.cpp
[root@bogon ~]#
コンパイル プロセス全体でエラーが報告されていないことがわかります。ただし、gcc 命令を使用する場合:
[root@bogon ~]# gcc demo.cpp
/tmp/ccIOnwra.o: In function `main’:
demo.cpp:(.text+0x13): undefined reference to `std::allocator
への未定義の参照
#多くのエラーメッセージを省略
読者はそれを自分でコンパイルでき、多くのエラー メッセージが表示されます。基本的な理由は、プログラムが標準ライブラリ <iostream> および <string> によって提供されるクラス オブジェクトを使用することですが、gcc はデフォルトではそれらを見つけることができません。
gcc コマンドを使用して C++ プログラムをコンパイルおよび実行する場合は、gcc コマンドを使用するときに -lstdc++ -shared-libgcc オプションを手動で追加する必要があります。これは、gcc が C++ プログラムをコンパイルするときに必要な C++ 標準ライブラリをリンクできることを意味します。プログラム。つまり、次のように demo.cpp ファイルをコンパイルできます。
[root@bogon ~]# gcc -xc++ demo.cpp -lstdc++ -shared-libgcc
[root@bogon ~]#
したがって、demo.cpp は正常にコンパイルされます。
読者は、g++ コマンドが
gcc -xc++ -lstdc++ -shared-libgcc
コマンドと同等であると考えることができます。明らかに後者は書くのが非常に面倒で、ほとんどの人は前者を好むでしょう。
gcc と g++ の命令については、他にも詳細な違いがあるため、ここでは繰り返しません。このセクションを読んだ後、読者は、C 言語プログラムをコンパイルするには gcc コマンドを使用する必要があることだけを知っておく必要があります。また、C++ プログラムのコンパイルには g++ コマンドを使用することをお勧めします。これで十分です。
では、正常にコンパイルされた C 言語または C++ プログラムを実行して、その実行結果を表示するにはどうすればよいでしょうか?次の章で詳しく説明します。