web-dev-qa-db-ja.com

makeとgccの違いは何ですか?

記事 の最後の文が私の目に留まりました

[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を呼び出します。これは、数百または数千のソースコードファイルがある大規模なプロジェクトや、コンパイラオプション、インクルードパスなどを追跡するのに非常に役立ちます。

60
unwind

gccは、単一のファイルをコンパイルおよび/またはリンクします。複数の言語をサポートしていますが、複数のソースファイルを組み合わせて重要な実行中のプログラムにする方法がわかりません。通常、最も単純なプログラムを作成するには、少なくとも2回のgccの呼び出し(コンパイルとリンク)が必要です。

GCCのウィキペディアのページでは、これを「コンパイラシステム」と説明しています。

GNUコンパイラコレクション(通常はGCCに短縮)は、さまざまなプログラミング言語をサポートするGNUプロジェクトによって作成されたコンパイラシステムです。

makeは、特定のシーケンスでコンパイラ(gccの場合もあります)を呼び出して複数のソースをコンパイルし、それらをリンクする「ビルドツール」です。また、ソースのコンパイルから生じるさまざまなソースファイルとオブジェクトファイル間の依存関係を追跡し、最後のビルド以降に変更されたコンポーネントに対する操作のみを実行します。

GNUmake はmakeの一般的な実装の1つです。 GNUmakeからの説明は次のとおりです。

Makeは、プログラムのソースファイルからプログラムの実行可能ファイルやその他の非ソースファイルの生成を制御するツールです。

Makeは、makefileと呼ばれるファイルからプログラムをビルドする方法についての知識を取得します。このファイルには、非ソースファイルのそれぞれと、他のファイルからプログラムを計算する方法がリストされています。

13
MaxVT

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/ さまざまな形式であります。

11
user25148

Make 頻繁にusesgcc 多数のCまたはC++ファイルをコンパイルします。

5
Ben S

make は本質的にコードを構築するためのエキスパートシステムです。物事がどのように構築され、何に依存するかについてのルールを設定します。 Makeは、すべてのファイルのタイムスタンプを調べて、いつでも何を再構築する必要があるかを正確に把握できます。

gcc は「gnuコンパイラコレクション」です。サポートされている言語はたくさんありますが(セットアップに応じてC、C++、Adaなど)、それでも、makeがシステムの構築に使用できるツールは1つにすぎません。

4
T.E.D.

Makeは、必要最小限の作業を行うことで、さまざまなシステムコンポーネント間に依存関係がある複雑なシステムを構築するためのツールです。

Makeが使用できるすべてのものを知りたい場合は、 GNU make manual が優れています。

4
anon

makeは、現在のディレクトリのMakefileを使用して、入力引数に一連のルールを適用します。 Makeは、現在のディレクトリにMakefile(または同様の)ファイルが見つからない場合でも実行されるように、いくつかのデフォルトルールも認識しています。 cppファイルに対して実行するルールは、多くのシステムでgccを呼び出すためです。

入力ファイル名ではなく出力を反映するルール名makeを呼び出すことに注意してください。したがって、make xyzを呼び出すと、ルールxyzが実行され、デフォルトでファイルxyzが作成されます(たとえば、ソースコードファイルxyz.cppに基づいて)。

4
Konrad Rudolph

Makeを使用してCおよびC++プログラムをコンパイルするには、makefileでgccまたはg ++を呼び出してすべてのコンパイルとリンクの手順を実行し、これらすべての手順を1つの簡単なコマンドで実行できるようにします。コンパイラの代わりにはなりません。

3
Bill the Lizard

gccjavacのようなコンパイラです。あなたはそれにソースファイルを与えます、それはあなたにプログラムを与えます。

makeはビルドツールです。ファイル間の依存関係に基づいてプロジェクト内のファイルをビルドする方法を説明するファイルが必要なため、1つのソースファイルを変更するときに、すべてを再構築する必要はありません(ビルドスクリプトを使用した場合など)。 makeは通常、gccを使用して実際にソースファイルをコンパイルします。

3
Zifre

'gcc'はコンパイラであり、実際にソースコードを実行可能ファイルに変換するプログラムです。ソースコードがどこにあるか、何を出力するか、そしてライブラリやオプションのような他のさまざまなことを伝える必要があります。

「make」は、プログラムをコンパイルするためのスクリプト言語のようなものです。これは、ソースのコンパイルのすべての詳細(コンパイラーに渡す必要のあるすべての引数)を非表示にする方法です。上記のすべての詳細をMakefileで一度スクリプト化するので、ファイルごとに毎回入力する必要はありません。また、更新されたソースファイルのみを再コンパイルし、依存関係を処理するなどの気の利いたことも行います(このファイルを再コンパイルする場合は、そのファイルを再コンパイルする必要があります)。

2
Chris Thornhill

最大の違いは、makeがチューリング完全( makefilesチューリング完全ですか? )であるのに対し、gccはそうではないことです。

1