[root@it-kiso demo]# ls
demo1.c demo1.o demo2.c demo2.o
[root@it-kiso demo]# cat demo1.c
#include
int main(){
printf(“GCC:https://it-kiso.com/gcc/”);
return 0;
}
[root@it-kiso demo]# cat demo2.c
#include
int main(){
printf(“Python:https://it-kiso.com/python/”);
return 0;
}
[root@it-kiso demo]# gcc -c demo1.c -o demo1.o
[root@it-kiso demo]# gcc -c demo2.c -o demo2.o
[root@it-kiso demo]# ls
demo1.c demo1.o demo2.c demo2.o
上記のように、demo1.c と demo2.c という 2 つの C 言語ソース プログラム ファイルを作成し、これを基にそれぞれ gcc -c コマンドを実行すると、GCC コンパイラは demo1.c、demo2 を順次コンパイルします。 .c がコンパイルされ、それぞれのオブジェクト ファイルが生成されます。
実際、1 つの gcc (g++) 命令で一度に複数のファイルを処理できることがよくあります。 demo1.c と demo2.c のコンパイルを例にとると、次のコマンドを実行できます。
[root@bogon デモ]# gcc -c demo1.c demo2.c
[root@bogon デモ]# ls
demo1.c demo1.o demo2.c demo2.o
demo1.c と demo2.c のコンパイル プロセスは gcc -c 命令を共有できることがわかります。これにより、デフォルトでそれぞれ demo1.o と demo2.o オブジェクト ファイルが生成されます。
このメソッドは、-o オプションを使用して、demo1.c および demo2.c をコンパイルするオブジェクト コードをそれぞれ指定されたファイルに出力できないことに注意してください。つまり、次のコード行が間違っています。
[root@bogon デモ]# gcc -c demo1.c demo2.c -o demo1.o demo2.o
gcc: demo2.o: そのようなファイルまたはディレクトリはありません
gcc: -o を -c と一緒に指定したり、-S を複数のファイルで指定したりすることはできません
どうやら、gcc 命令は私たちが思っていたほどスマートではありません。
それだけでなく、次の操作で gcc 命令を共有できます。
- 複数の C (C++) ソース ファイルをアセンブリ ファイルまたはオブジェクト ファイルに処理します。
- 複数の C (C++) ソース ファイルまたは前処理済みファイルをアセンブリ ファイルまたはオブジェクト ファイルに処理します。
- 複数の C (C++) ソース ファイル、前処理済みファイル、またはアセンブリ ファイルをターゲット ファイルに処理します。
- 同じプロジェクト内で、さまざまなソース ファイル、前処理ファイル、アセンブリ ファイル、およびオブジェクト ファイルが 1 つの gcc 命令を使用して、最終的に実行可能ファイルを生成できます。
複数の C (C++) ソース ファイルでも gcc -E 命令を使用して前処理操作を完了することができますが、この命令はデフォルトで前処理結果を画面に出力するだけなので、前処理操作は完了できますが、それぞれの前処理済みファイルを生成します。
例として、demo1.c と demo2.c のソース プログラム ファイルを取り上げます。
[root@bogon デモ]# gcc -E demo1.c -o demo1.i
[root@bogon デモ]# ls
demo1.c demo1.i demo2.c
[root@bogon デモ]# gcc -c demo1.i demo2.c
[root@bogon デモ]# ls
demo1.c demo1.i demo1.o demo2.c demo2.o
最初に、demo1.c ソース ファイルが個別に前処理され、demo1.i ファイルが生成されることがわかります。これに基づいて、gcc -c コマンドを 1 つだけ使用して、demo1.i と demo2.c をそれぞれ demo1.o と demo2.o オブジェクト ファイルにコンパイルします。
GCC はマルチファイル プロジェクトをコンパイルします
C (または C++) のプロジェクトでは、複数のソース ファイルが格納されることがよくありますが、これまでの「ソース ファイルを個別にコンパイルしてからリンクする」という従来の方法でプロジェクトをコンパイルすると、多数のコンパイル ファイルを記述する必要があります。これにより、半分の労力で 2 倍の結果が得られます。実際、gcc 命令の機能を使用して複数のファイルを同時に処理すると、作業効率が大幅に向上します。
たとえば、次は 2 つのソース ファイルを含む C 言語プロジェクトです。
[root@bogon デモ]# ls
main.c myfun.c
[root@bogon デモ]# cat main.c
#include <stdio.h>
intメイン(){
画面();
0 を返します。
}
[root@bogon デモ]# cat myfun.c
#include <stdio.h>
ボイドディスプレイ(){
printf(“GCC:https://it-kiso.com/gcc/”);
}
[root@bogon デモ]#
プロジェクトには 2 つのソース ファイルしか含まれていないことがわかります。そのうちの myfun.c ファイルはいくつかの機能関数を格納するために使用され、main.c ファイルで直接呼び出すことができます。
このプロジェクトでは、次のようにコンパイルできます。
[root@bogon デモ]# ls
main.c myfun.c
[root@bogon デモ]# gcc -c myfun.c main.c
[root@bogon デモ]# ls
main.c main.o myfun.c myfun.o
[root@bogon デモ]# gcc myfun.o main.o -o main.exe
[root@bogon デモ]# ls
main.c main.exe main.o myfun.c myfun.o
[root@bogon デモ]# ./main.exe
GCC:https://it-kiso.com/gcc/
さらに、gcc 命令はそれらを直接コンパイルおよびリンクできます。
[root@bogon デモ]# gcc myfun.c main.c -o main.exe
[root@bogon デモ]# ls
main.c main.exe myfun.c
[root@bogon デモ]# ./main.exe
GCC:https://it-kiso.com/gcc/
上記の 2 つの方法は、ほとんどのシナリオのニーズを満たすことができます。ただし、1 つのプロジェクトに 10 を超えるソース ファイルがある場合、1 つの gcc コマンドを共有してコンパイル (およびリンク) する場合でも、各ファイルの名前を記述するのは面倒です。
この問題を解決するには、プロジェクト ディレクトリに入り、*.c を使用してすべてのソース ファイルを表します。つまり、次の命令を実行します。
[root@bogon デモ]# ls
main.c myfun.c
[root@bogon デモ]# gcc *.c -o main.exe
[root@bogon デモ]# ls
main.c main.exe myfun.c
[root@bogon デモ]# ./main.exe
GCC:https://it-kiso.com/gcc/
したがって、各ソース ファイルの名前を手動で入力する時間が大幅に節約されます。