Makefileの簡単なチュートリアル

Makefileの概要

ソフトウェア開発では、メイクは、多くの場合、ソフトウェアのビルド・ツールとして見られています。このツールは、主にソフトウェアの構築を自動化するために、「メイク」または「Makefileの」ファイル名の一種を読んですることです。それは、関連文書間の依存性を検証による「ターゲット」という概念呼ばれる、この依存関係検査システムは、時間の比較ファイルを変更することで、非常に簡単です。ほとんどの場合、私たちは主に、実行可能ファイルまたはライブラリファイルを生成するために接続するには、ソースコード、コード生成された結果、結果コードをコンパイルするためにそれを使用します。

長所と短所

それぞれ、メイク、などの最も古いUnixツールとは異なり、またサポーターと反対派が多数を持っています。これは、近代的な大規模なソフトウェアプロジェクトへの適応には多くの問題を抱えています。しかし、多くの人々は、一般的な状況の大半、そして非常に、シンプルに強力かつ明確な使用に対応できるしっかりと(私を含め)信じて残っています。いずれにせよ、それは今の多くは、まだ完全なオペレーティングシステムをコンパイルするために使用されます、そして、それは、これらの「より現代的な」選択肢は、その基本的な操作ではあまり差がないのです。

もちろん、近代的な統合開発環境(IDE)の誕生、そして特に非Unixプラットフォーム上で、多くのプログラマは、もはや、マニュアル管理関係のチェックに頼っていなくても、このプロジェクトの一部であるファイルを管理する必要はありませんが、これらのタスクそれを行うには、開発環境に引き渡さ。同様に、多くの現代のプログラミング言語は、自分自身を持つことができます(Antなど)を効率よく構成する依存関係。

主なバージョン

プログラムは、すべての当事者が、いくつかの改善を行うために彼らの特定のニーズに基づいて、パーティーを書き換えると、書き換えを何度も経験したします。現在、市場で最も人気のあるバージョンは以下の通りです:

  • GNUを行います
    書き換えて、コメントを追加著者は、新機能を追加することの価値を考えて、そしてGNUビルドシステムは、しばしば一緒に使用されてきた(クリーンルームエンジニアリングを通じて)GNUの標準的な機能が作る作る、GNU Linuxの大多数は、デフォルトでインストールツール。

  • BSDメイク:
    このバージョンでは、アダムからデ山猿の生産バージョンで開発されています。それは同時に、コンパイルのターゲットで計算する能力を持っています。主にFreeBSDの、NetBSDのとOpenBSD、これらのシステムで使用されます。

  • マイクロソフトNMAKE:
    このバージョンでは、主にMicrosoftのWindowsシステムに使用され、それはUnixとMicrosoftのNMAKE NMAKEのプロジェクトは、2つの異なるものであることに注意することが必要であり、混同しないでください。

簡単な例から

我々は、説明であることが4.5この例ではK&R Cを使用することができます。この例では、メインプログラム・コード(main.cの)三の機能コード(getop.c、stack.c、getch.c)およびヘッダファイル(calc.h)が表示されます。通常の状況下で、我々はそれをコンパイルする必要があります。

gcc -o calc main.c getch.c getop.c stack.c 

開発プロセスには、メイクファイル、+デバッガは、我々は常に上に、このコンパイル・コマンドを再入力する必要がない、またはある場合には常に、端末の履歴機能で実行される最新のコマンドを見つけるには、矢印キーを押してください。2つの欠点を行います。

  1. ターミナル履歴が失われると、我々はゼロからスタートしなければなりません。

  2. 私たちは、コンパイラは非常に時間がかかることがありますので、ファイルが十分な大きさである場合、コンパイラは、すべてのコマンドファイルを再コンパイルしますするファイルを変更するたびに。

Makefileのように、彼らは何をすべきか?簡単なメイクファイルで見てみましょう:

CALC:main.cのgetch.c getop.c stack.c 
    のgcc -oカルクmain.cのgetch.c getop.c stack.c

今、あなたは基本的なMakefileの文です、それは主に3つの部分、コロンの最初の行の前にカルクに分割され、我々は(ターゲット)のゴールを呼び出し、この文の対象であると考えられて見に処理されるべきであり、特定ここで私たちは、このプログラムのcalcをコンパイルしたいものです。コロン(main.cのgetch.c getop.c stack.c)の背面部分には、我々は長い間変更があったとして、これらのファイルは、ファイルにコンパイルのcalc必要である依存関係テーブルを呼び出し、それが文をトリガーしますあなたは、これはコンパイラのコマンドで見ることができるように、我々は、コマンドの一部を呼び出す第三部、。今の文以上、私たちだけの2行は、Makefileのか、メイクファイルという名前のファイルに書き込まれ、その後、あなたが私たちのセットに従ってプログラムをコンパイルするためにそれが表示されます、ターミナルでmakeコマンドを入力します。

あなたは、コマンドの「gccの」二行目の前のタブインデントを持たなければならないことに注意してください。構文規定は、任意の順序でのMakefileの前にタブインデントを持っている必要があり、そうでなければ、エラーを行います。

次に、私たちは、最初の予備は上記のコードを修正し、効率の問題を解決するために見てみましょう:

CC = GCC 
PROM = CALC 
ソース = main.cのgetch.c getop.c stack.c 
 
$(PROM):$(ソース)
    $(CC) $(PROM)$(ソース)-O

あなたが見ることができるように、我々は3つの定数のccで、プロムと上記のコードでソースを定義しています。彼らは、私たちは、ソースとターゲットのファイルをコンパイルするために使用されるコンパイラをしなければならない言われます。その結果、我々はこれら三つのいずれかを変更する必要があり、将来的に、唯一のチューブのコードセクションの背面に定数の定義ではなく、外出先を変更する必要があります。

プロムと呼ばれる元の変数が個人的に彼らは、ファイル全体の実行中に変更されていないので、それは、不適切だと思う、文字列置換の役割は、単にだけで、ここで多くのチュートリアルccのことに注意してください、マクロ定義は、C言語に非常によく似ています。それとも、実際には、それがマクロです。

しかし、今、私たちはすべての問題を再コンパイルする必要があり、まだ我々は単にファイルを変更すると解決することができません。そして、我々が変更されたファイルcalc.hある場合、makeは変化を検出することができません(ヘッダファイルなどの特殊な定数を設定し、依存関係テーブルに追加する必要があります)。さて、この問題を解決する方法について考えてみましょう。アカウントに標準のコンパイルプロセスを取ると、それがオブジェクトファイルにコンパイルして、実行可能ファイルにオブジェクト・ファイルを接続され、多くの場合、最初のソースファイルです。私たちは、これらのファイル間の依存関係を調整するためにこれを使用することができます:

CC = GCC 
PROM = CALC 
DEPS = calc.h 
OBJ = main.o getch.o getop.o stack.o 
 
$(PROM):$(OBJ)
    $(CC) - $(PROM)$(OBJ)O 

メイン。 O:main.cの$(DEPS)
    $(CC) - C main.cの

getch.o:getch.c $(DEPS)
    $(CC) - C getch.c 

getop.o:getop.c $(DEPS)
    $ (CC) - C getop.c 

stack.o:stack.c $(DEPS)
    $(CC) -c stack.c    

その結果、非常に長いったらしい、長ったらしい、多くの場合、低効率を伴う上記の問題点が明らかに解決し、私たちは、コードをせている、それは不吉です。再観察した後、我々はすべての.cに同じ名前の.oファイルにコンパイルされることがわかりました。私たちは、機能のさらなる簡素化に基づいて、再びそれを行うことができます。

CC = GCC 
PROM = CALC 
DEPS = calc.h 
OBJ = main.o getch.o getop.o stack.o 

$(PROM):$(OBJ)
    $(CC) - $(PROM)$(OBJ)O

%。 O:%$(DEPS).C 
    $(CC) -c $ <-o $ @

ここでは、我々はいくつかの特別なマクロを使います。.oのオブジェクトのすべての.cファイル上の同名の(もちろん、ヘッダファイルにリストされているDEPS)に依存していることを示す、規則的なパターンである%のC、:最初の%の.oです。再び私たちに特定の%で、コマンド$ <および$は<表の最初の依存関係を表すの部分@ $(私たちはテーブル全体を参照したい場合は、その後、あなたは$ ^を使用する必要があります)です.C。$は、@すなわち%の.o、目標の現在のステートメントを表します。その結果、makeコマンドは、自動的に同じ名前の.oファイルにすべての.cソースファイルをコンパイルします。私たちは、指定された一つ一つを行く必要はありません。多くの天然シンプルさの全体のコード。

これまでのところ、我々は、少なくとも小規模なプロジェクトは問題ありません維持するために、優れたメイクファイルを持っています。あなたは、さらに上記のプロジェクトのスケーラビリティを向上させたい場合はもちろん、私たちは、Makefileの擬似目的関数やルールのいくつかを使用する必要があります。私たちは、自動クリーニング機能を増やしたい場合たとえば、あなたは擬似ターゲットとその定義されたルールの結果をコンパイルすることができます。

CC = GCC 
PROM = CALC 
DEPS = calc.h 
OBJ = main.o getch.o getop.o stack.o 

$(PROM):$(OBJ)
    $(CC) - $(PROM)$(OBJ)O

%。 O:%$(DEPS).C 
    $(CC) -c $ < - O $ @ 

クリーン:
    RM -rf $(OBJ)$(プロム)

私たちは、端末にきれいなコマンドを作る実行上記のコードの最後の2行、で、それはプロジェクトによって生成されたすべてのコンパイル済みのファイルを削除するために行くだろう。

また、我々はプロジェクトへ.Cまたは.Hを追加する必要がある場合、それは同時にする必要があるかもしれないし、手動でこのリストが長い場合、コードはこの目的のために、私たちに必要な、非常に醜いだろう、最初のOBJ定数の.oファイルを追加しますMakefileで使用する関数は、ここでは2を示します。

CC = gccの
プロム = CALC 
DEPS = $(シェルのfind ./ -name " * .H " 
SRC = $(シェルのfind ./ -name " * .C " 
OBJ = $(SRC:%C =% O)

$(プロム):$(OBJ)
    $(CC) - $(プロム)$(OBJ)O

%の.o:%.cの$(DEPS)
    $(CC) -c $ < - $ @ O 

クリーン:
    RM -rf $(OBJ)$(プロム)

シェル関数は、主にここにシェルコマンドの特定を実行するために使用され、現在のディレクトリ内のすべての.cと.hファイルを見つけることです。$(SRC ..%C = O%)は、文字代替機能である、それはすべての.cのsrc文字列は.oのに置き換えられますが、実際には、結果がコンパイルされるすべての.cファイルをリストに相当します。これらの2つの設定では、将来的に.Cと.hファイルの数は、我々はこのプロジェクトに参加するかどうか、Makefileは自動的に過去のプロジェクトに含まれます。

ここでは、基本的に日常的に使用されるMakefileは再びプレゼンテーションを書き込みました。あなたはより多くのメイクとメイクについて知りたい場合は、を参照してくださいGNUメイクマニュアル

 

参考:http://www.cnblogs.com/owlman/p/5514724.html

おすすめ

転載: www.cnblogs.com/doggod/p/12166596.html