記事 の最後の文が私の目に留まりました
[F]またはC/C++開発者と、LinuxのユーザーではなくC/C++でのプログラミングの学習に関心のある学生。これは、GNU/Linuxでは「make」コマンドを使用することでソースコードのコンパイルが簡単になるためです。
私は常にgccを使用してC/C++プログラムをコンパイルしましたが、javacを使用してJavaプログラムをコンパイルしました。makeを使用して、configure/make/makeinstallによってコンピューターにプログラムをインストールしただけです。
Makeコマンドですべてのプログラムをコンパイルできるようです。
makeとgccの違いは何ですか?
ええと... gccはコンパイラで、makeはプログラムのビルドを支援するツールです。違いは大きいです。 makeだけを使用してプログラムを作成することはできません。コンパイラではありません。ソースコードから完成したプログラムに移行する方法を説明する「ルール」の別のファイルを導入する理由は何ですか。次に、このファイルを解釈し、何をコンパイルする必要があるかを判断し、gccを呼び出します。これは、数百または数千のソースコードファイルがある大規模なプロジェクトや、コンパイラオプション、インクルードパスなどを追跡するのに非常に役立ちます。
gccは、単一のファイルをコンパイルおよび/またはリンクします。複数の言語をサポートしていますが、複数のソースファイルを組み合わせて重要な実行中のプログラムにする方法がわかりません。通常、最も単純なプログラムを作成するには、少なくとも2回のgccの呼び出し(コンパイルとリンク)が必要です。
GCCのウィキペディアのページでは、これを「コンパイラシステム」と説明しています。
GNUコンパイラコレクション(通常はGCCに短縮)は、さまざまなプログラミング言語をサポートするGNUプロジェクトによって作成されたコンパイラシステムです。
makeは、特定のシーケンスでコンパイラ(gccの場合もあります)を呼び出して複数のソースをコンパイルし、それらをリンクする「ビルドツール」です。また、ソースのコンパイルから生じるさまざまなソースファイルとオブジェクトファイル間の依存関係を追跡し、最後のビルド以降に変更されたコンポーネントに対する操作のみを実行します。
GNUmake はmakeの一般的な実装の1つです。 GNUmakeからの説明は次のとおりです。
Makeは、プログラムのソースファイルからプログラムの実行可能ファイルやその他の非ソースファイルの生成を制御するツールです。
Makeは、makefileと呼ばれるファイルからプログラムをビルドする方法についての知識を取得します。このファイルには、非ソースファイルのそれぞれと、他のファイルからプログラムを計算する方法がリストされています。
gccはCコンパイラです。Cソースファイルを受け取り、リンクされていないオブジェクトファイルの形式で、またはすべてのオブジェクトモジュールとライブラリにリンクされている実際の実行可能プログラムとしてマシンコードを作成します。
makeは、プロジェクトのビルドプロセスを制御するのに役立ちます。典型的なCプログラムは、いくつかのモジュール(.c)とヘッダーファイル(.h)で構成されています。何かを変更した後は常にすべてをコンパイルするのは時間がかかるので、makeは変更後に再コンパイルする必要がある部分だけをコンパイルするように設計されています。
これは、プログラマーが作成したルールに従うことによって行われます。例えば:
foo.o: foo.c foo.h
cc -c foo.c
このルールは、ファイルfoo.oがファイルfoo.cとfoo.hに依存していることを示しており、どちらかが変更された場合は、2行目のコマンドを実行してビルドできます。 (上記は実際の構文ではありません。makeは、この編集モードでは実行できないTAB文字でインデントされたコマンドを必要とします。ただし、そこにあると想像してください。)
makeは、通常Makefileと呼ばれるファイルからルールを読み取ります。これらのファイルは(従来は)手作業で作成されているため、makeにはルールを短くするための多くの魔法があります。たとえば、foo.oはfoo.cから構築できることを知っており、そのためのコマンドが何であるかを知っています。したがって、上記のルールは次のように短縮できます。
foo.o: foo.h
3つのモジュールで構成される小さなプログラムには、次のようなMakefileがあります。
mycmd: main.o foo.o bar.o
$(CC) $(LDFLAGS) -o mycmd main.o foo.o bar.o
foo.o: foo.h bar.h
bar.o: bar.h
makeは、プログラムをコンパイルするだけではありません。一般的なMakefileには、不要なファイルをクリーンアップするルールがあります。
clean:
rm -f *.o core myapp
別のルールがテストを実行する可能性があります。
check: myapp
./myapp < test.input > test.output
diff -u test.correct test.output
Makefileはドキュメントを「構築」する場合があります。たとえば、ツールを実行して、ドキュメントをマークアップ言語からHTMLやPDFに変換します。
Makefileには、ユーザーまたはシステム管理者がインストールしたい場所に、ビルドしたバイナリプログラムをコピーするためのインストールルールがある場合があります。
等々。 makeは汎用的で強力であるため、通常、ソースtarballの解凍から、ソフトウェアをユーザーが使用できるようになるまでのプロセス全体を自動化するために使用されます。
あなたがそれを完全に学びたいのであれば、makeについて学ぶことはたくさんあります。 GNUバージョンのmakeには、特に優れたドキュメントがあります: http://www.gnu.org/software/make/manual/ さまざまな形式であります。
Makeは、必要最小限の作業を行うことで、さまざまなシステムコンポーネント間に依存関係がある複雑なシステムを構築するためのツールです。
Makeが使用できるすべてのものを知りたい場合は、 GNU make manual が優れています。
make
は、現在のディレクトリのMakefile
を使用して、入力引数に一連のルールを適用します。 Makeは、現在のディレクトリにMakefile
(または同様の)ファイルが見つからない場合でも実行されるように、いくつかのデフォルトルールも認識しています。 cpp
ファイルに対して実行するルールは、多くのシステムでgcc
を呼び出すためです。
入力ファイル名ではなく出力を反映するルール名でmake
を呼び出すことに注意してください。したがって、make xyz
を呼び出すと、ルールxyz
が実行され、デフォルトでファイルxyz
が作成されます(たとえば、ソースコードファイルxyz.cpp
に基づいて)。
Makeを使用してCおよびC++プログラムをコンパイルするには、makefileでgccまたはg ++を呼び出してすべてのコンパイルとリンクの手順を実行し、これらすべての手順を1つの簡単なコマンドで実行できるようにします。コンパイラの代わりにはなりません。
gcc
はjavac
のようなコンパイラです。あなたはそれにソースファイルを与えます、それはあなたにプログラムを与えます。
make
はビルドツールです。ファイル間の依存関係に基づいてプロジェクト内のファイルをビルドする方法を説明するファイルが必要なため、1つのソースファイルを変更するときに、すべてを再構築する必要はありません(ビルドスクリプトを使用した場合など)。 make
は通常、gcc
を使用して実際にソースファイルをコンパイルします。
'gcc'はコンパイラであり、実際にソースコードを実行可能ファイルに変換するプログラムです。ソースコードがどこにあるか、何を出力するか、そしてライブラリやオプションのような他のさまざまなことを伝える必要があります。
「make」は、プログラムをコンパイルするためのスクリプト言語のようなものです。これは、ソースのコンパイルのすべての詳細(コンパイラーに渡す必要のあるすべての引数)を非表示にする方法です。上記のすべての詳細をMakefileで一度スクリプト化するので、ファイルごとに毎回入力する必要はありません。また、更新されたソースファイルのみを再コンパイルし、依存関係を処理するなどの気の利いたことも行います(このファイルを再コンパイルする場合は、そのファイルを再コンパイルする必要があります)。
最大の違いは、makeがチューリング完全( makefilesチューリング完全ですか? )であるのに対し、gccはそうではないことです。