これまでの説明で、C および C++ プログラムの「コンパイル」について言及してきたことに注意してください。これは本来、C および C++ コードを実行可能プログラム (Windows システムの .exe サフィックスを持つ実行可能ファイルに相当) に変換することを意味します。しかし実際には、ソースコードからCやC++のプログラムから実行可能なプログラムを生成するプロセスは、前処理、コンパイル、アセンブル、リンクという4つのプロセスを経る必要があります。
同様に、GCC コンパイラを使用して C または C++ プログラムをコンパイルする場合も、これら 4 つのプロセスを実行する必要があります。ただし、実際の使用では、ユーザーはプログラムの実行結果を気にせず、最終的な実行可能プログラムをすばやく取得したいだけであるため、gcc と g++ の両方がこの要件をサポートしています。
まず、C 言語プログラムの実行を例として、gcc を使用して対応する実行可能プログラムを素早く取得する方法を示します。以下は C 言語プログラムです。
#include <stdio.h>
int main(){
puts("GCCチュートリアル:https://it-kiso.com/gcc/");
return 0;
}
上記のように、これは「Hello, World!」という文字列を出力する非常に単純な C 言語プログラムです. 次に、コマンド ライン ウィンドウ (ターミナル) を開き、次の gcc コマンドを記述します。
[root@bogon ~]# gcc demo.c
Enter キーを押すと、GCC コンパイラは、現在のディレクトリに対応する実行可能ファイルを生成するのに役立ちます. ファイルの名前は a.out です. ファイルが存在するかどうかは、ls コマンドで確認できます:
[root@bogon ~]# ls
a.out demo.c
#他にもファイルがあるかもしれませんので、ここでは個別に記載しませんが、これを基にファイルを実行し、実行結果を確認し、次の命令を書き続けます。
[root@bogon ~]# ./a.out
GCCチュートリアル: https://it-kiso.com/gcc/
以前の調査を通じて、C++ プログラムの実行と C 言語プログラムの実行の違いは、g++ 命令または gcc -xc++ -lstdc++ -shared-libgcc 命令のいずれかを使用することであることがわかっています。たとえば、次の単純な C++ プログラムは次のとおりです。
//位于 demo.cpp 文件中
#include <iostream>
using namespace std;
int main(){
cout << "GCCチュートリアル:https://it-kiso.com/gcc/" << endl;
return 0;
}
このプログラムを実行するには、次の命令を記述して実行します。
[root@bogon ~]# g++ demo.cpp #または gcc -xc++ -lstdc++ -shared-libgcc demo.cpp
同様に、GCC コンパイラは、現在のディレクトリに a.out という名前の実行可能ファイルを生成します (以前に同じ名前のファイルがあった場合、古いファイルは上書きされます)。このファイルは、次のコマンドで実行できます。
[root@bogon ~]# ./a.out
GCCチュートリアル: https://it-kiso.com/gcc/
gcc または g++ コマンドは、C および C++ プログラムを実行する以前の gcc および g++ コマンドを変更するなど、ユーザーが最終的な実行可能ファイルのファイル名を手動で指定することもサポートしていることに注意してください。
[root@bogon ~]# gcc demo.c -o demo.exe
[root@bogon ~]# g++ demo.cpp -o democpp.exe # または gcc -xc++ -lstdc++ -shared-libgcc demo.cpp -o democpp.exe
-o オプションは、生成するファイル名を指定するために使用されます。たとえば、-o demo.exe は、生成されるファイル名を demo.exe に設定することを意味します。
GCC コンパイラは、gcc (g++) コマンドを使用して、指定された C (C++) プログラムの「ワンステップ コンパイル」をサポートしていることがわかります。
gcc または g++ 命令を 1 つしか記述していませんが、基本的な基本は、前処理、コンパイル、アセンブル、およびリンクのプロセスに従って、C および C++ プログラムを実行可能プログラムに変換することです。ただし、この実行モードでは、デフォルトでは前処理段階、コンパイル段階、およびアセンブリ段階で生成されるはずの中間ファイルは生成されず、最終的な a.out 実行ファイルのみが生成されます (-save- が追加されていない場合)。 gcc または g++ temps オプションの場合)。
初心者の場合、C および C++ プログラムを実行可能プログラムに変換するプロセス全体を詳しく調べ、プロセス中に生成される中間ファイルを表示する必要がある場合があります。このように、上記の実行方法は使用されなくなり、段階的なコンパイル方法が採用されます。
いわゆる「段階的コンパイル」とは、ユーザーが手動で GCC コンパイラを呼び出して、C および C++ ソース コードの前処理、コンパイル、アセンブル、およびリンク プロセスを完了することを意味し、ソース コードの処理済みファイルは次のようになります。各段階で生成されます。
では、C および C++ プログラムを段階的にコンパイルするにはどうすればよいでしょうか。実際、gcc と g++ の 2 つの命令に加えて、GCC コンパイラは多数の命令オプションも提供します。これは、ユーザーが必要に応じてコンパイル方法をカスタマイズするのに便利です。前の学習プロセスでは、-xc++、-lstdc++、-shared-libgcc などのいくつかのコマンド オプションを使用し、その後に C++ プログラムをコンパイルするときに gcc コマンドを使用し、-o オプションを使用して実行可能ファイル名を手動で指定しました。
表 1 に、gcc または g++ コマンドを使用して C/C++ プログラムをコンパイルするときに一般的に使用されるコマンド オプションをいくつか示します。
gcc/g++ コマンド オプション | 関数 |
---|---|
-E (大文字) | 指定されたソース ファイルをコンパイルせずに前処理します。 |
-S (大文字) | 指定されたソース ファイルをコンパイルしますが、アセンブルはしません。 |
-c | 指定されたソース ファイルをコンパイル、アセンブルしますが、リンクしません。 |
-o | 生成されるファイルのファイル名を指定します。 |
-library (-I ライブラリ) | library は、検索するライブラリ ファイルの名前を表します。このオプションは、プログラムがリンク リンクで呼び出すことができるライブラリ ファイルを手動で指定するために使用されます。 -l とライブラリ ファイル名の間にスペースを使用しないことをお勧めします (例: -lstdc++)。 |
-ansi | C 言語プログラムの場合は -std=c90 に相当し、C++ プログラムの場合は -std=c++98 に相当します。 |
-std= | c89、c90、c++98、c++11 など、プログラミング言語が準拠する標準を手動で指示します。 |
表 1 は、初心者が一般的に使用するコマンド オプションの一部のみを示していることに注意してください. 実際には、これは氷山の一角にすぎません. GCC コンパイラは、ほとんどのシナリオでのコンパイルのニーズを満たすために、多数のコマンド オプションを提供します.コンパイル手順の詳細については、関心のある読者はGCC マニュアルを自分で確認できます。
次の章では、表 1 に基づいて、段階的コンパイルの実装方法、つまり、ソース コード プログラムを前処理、コンパイル、アセンブル、リンクの 4 つのプロセスで処理し、最終的にプログラムを生成する方法について詳しく説明します。対応する実行可能プログラム。