Wei Dongshan Embedded入門ノート-アプリケーション開発の基礎(2)

3、Makefileの使用

1. Makefileが必要な理由
プログラムの作成後、1つのソースファイル(.hファイルなど)のみが変更された場合、一連のコマンドですべてのソースファイルを再コンパイルすることは不可能であり、場合によってはさらに多くのソースファイルがあります。最後に、いくつかのソースファイルをコンパイルするのを忘れてください。makeツールは上記の問題を解決でき、必要に応じて変更の影響を受けるすべてのソースファイルを再コンパイルします。Makefileは、プログラムにコンパイルしてリンクする方法をmakeに指示します。Makefileの利点は、「自動コンパイル」です。一度作成すると、必要なmakeコマンドは1つだけで、プロジェクト全体が完全に自動的にコンパイルされるため、ソフトウェア開発の効率が大幅に向上します。

Makefileファイルは通常、プロジェクトの他のソースファイルと同じディレクトリに配置されます。

2. Makefileの簡単なルール:

単純なMakefileファイルには、一連の「ルール」が含まれています。スタイルは次のとおりです。

ターゲット依存(前提条件)//ターゲットプログラムまたは依存ファイル: 依存ファイル

<tab>コマンド(コマンド)//「依存ファイル」が「ターゲットファイル」よりも新しい(つまり変更されている)場合は、「コマンド」を実行して「ターゲットファイル」を再生成します。

2つのコマンドが実行される条件:ターゲットファイルnewまたはターゲットドキュメントよりも依存ファイルも生成されませんでした

コマンドはMakeによって実行されるアクションです。ルールには複数のコマンドを含めることができ、各コマンドは1行を占めます。注:各コマンドラインの前にはタブ文字を付ける必要があります。つまり、コマンドラインの最初の文字はタブです。これは事故が間違いを犯しやすい場所です。

3.最初Makefileの2つの機能を紹介ます

A.   $(foreach var、list、text)

簡単に言えば、リスト内の変数ごとに、テキストに変更します。

リスト内の各要素について、それを取り出してvarに割り当ててから、varをテキストで記述された形式に変更します。

例:

objs:= boへ

dep_files:= $(foreach f、$(objs)、。$(f).d)//最終的なdep_files:= .aod .bod


B.   $(ワイルドカードパターン)

パターンにリストされているファイルが存在するかどうかにかかわらず、既存のすべてのファイルをリストします。

例:

src_files:= $(wildcard * .c)//最後に、現在のディレクトリ内のすべての.cファイルがsrc_filesにリストされます。


4. makeコマンドを使用する場合、最初に現在のディレクトリでMakefileという名前のファイルを検索し、次にMakefile内のコマンドを実行して、実行されたコマンドをターミナルに表示します。

book @ 100ask:〜/ 04_test_Makefile $ make
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test main.o sub.o

ターゲットプログラム/ファイルを変更する必要がない場合は、ターゲットプログラムが最新であるというプロンプトが表示されます。

book @ 100ask:〜/ 04_test_Makefile $ make
make: 'test'は最新です。


5. Makefileファイルを作成するときは、ファイル形式をMakefileとして選択します


6.コマンドの実行はシーケンシャルです:Makefileファイルのコマンドが次の場合:

テスト:main.o sub.o
    gcc -o test main.o sub.o

main.o:main.c
     gcc -c -o main.o main.c

sub.o:sub.c
      gcc -c -o sub.o sub.c

最初のターゲットファイルテストはmain.oとsub.oに依存します。これは、main.oが存在しないため、2番目のコマンドにスキップして、最初にgcc -c -o main.o main.cを実行し、次に最初に戻ります。行、sub.oが存在しないことがわかったので、3番目の段落にスキップして、gcc -c -o sub.o sub.cを実行します。最初の行に戻ると、2つの依存ファイルが存在し、ターゲットファイルが存在します。条件が満たされた場合に生成されますテスト


7. make clean:Makefileでターゲットファイルcleanの関連コマンドのみを実行します。


8. $ @はすべてのターゲットファイルを意味し、$ ^はすべての依存ファイルを意味し、$ <は最初の依存ファイルを意味します

%.o:%。c
       gcc -c -o $ @ $ ^


9.ターゲットファイルに2つの依存ファイルがあり、一方にコマンドがあり、もう一方にコマンドがない場合、2つの依存ファイルはマージされます。コマンドなしで依存ファイルを変更すると、別の依存ファイルコマンドもトリガーされます。
ただし、コマンドなしで依存ファイルの下に空白行が必要であり、空白行にTabキーを付けることはできません。


10.実現したい効果:ソースファイルまたはヘッダーファイルを変更する場合は、makeコマンドを使用して関連ファイルを再コンパイルするだけで、APPを再生成できます。セクション4-3-1を参照してください(理解できません)
①理由きれいな作品を作る繰り返し使用?テストのようなプログラムをきれいにしませんか?クリーンが存在する場合、なぜそれを繰り返し生成できるのですか?
②なぜ.main.dのファイル形式に変更するのですか?
③objs:= main.o sub.oの使い方は?
④objsを使用するときに$ {objs}の形式を使用するのはなぜですか?

 

11.一般的なMakefileの使用方法:
(1)最上位のMakefile、Makefile.buildをプログラムの最上位ディレクトリに配置
  し、それぞれのサブディレクトリに空のMakefile作成します。

(2)コンパイルするソースファイル
  を決定する手順:
(1)必要に応じて最上位ディレクトリのMakefileのobj-y を変更して追加します
(2)各サブディレクトリの空白のMakefileにobj-y を追加します

   obj-yの説明:
   obj-y + = xxx.o
   obj-y + = yyy /           
   ①これは、現在のディレクトリ(.cファイルをコンパイルして.oファイルを取得する)とyyyサブディレクトリでxxx.cをコンパイルすることを意味します。 (yyyディレクトリのMakefileは、ディレクトリでコンパイルする必要のあるファイルとサブディレクトリを指定します)
   ②スラッシュ/はyyyがサブディレクトリであること意味します/省略できません

(3)コンパイルオプションとリンクオプション
  を決定する手順:
(1)すべての.cファイルをコンパイルするときに使用する必要があるコンパイルオプションであるトップディレクトリMakefileのCFLAGSを変更します。
           トップMakefileには次のような段落があります。

     CFLAGS + = -I $(shell pwd)/ include

          プロジェクトファイル内のすべてのヘッダーファイルはインクルードディレクトリに配置されるため、この段落は次のことを意味します。すべての.cファイルをコンパイルすると、ファイルの下にインクルードディレクトリ(ファイル内のヘッダーファイル)が見つかります。

(2)を変更します。トップレベルディレクトリMakefileのLDFLAGS、これは最後のアプリケーションをリンクするときのリンクオプションです
           。LDFLAGSは、リンクするときにライブラリの場所とライブラリの名前を指定できます。

     LDFLAGS:= -L dir -labc

           -Lは、指定されたライブラリの場所です。現在の場所の下のdirディレクトリです。-l(小文字のL)は、ライブラリの名前をabcとして指定します。

(3)他のコンパイルオプション(オプション)を設定
           し、それぞれのサブディレクトリのMakefile変更します:
           "EXTRA_CFLAGS"。これは、現在のディレクトリ内のすべてのファイル(その下のサブディレクトリを除く)に追加のコンパイルオプションを設定します
           。そのままにしておくことができます。CFLAGS_xxx。 o "、現在のディレクトリのxxx.cに独自のコンパイルオプションを設定しますが、設定できません
   
(4)どのコンパイラを使用しますか?
  トップレベルディレクトリMakefile最初の行にあるCROSS_COMPILEを変更して、ツールチェーンのプレフィックス(arm-linux-など)を指定します。gccで
  コンパイルされている場合、割り当ては実行されません。
   
(5)の名前を決定します。アプリケーション:
  トップレベルディレクトリMakefileのTARGETを変更します。これは、コンパイルされたプログラムの名前を指定するために使用されます。たとえば、次のようになります。

TARGET:=テスト

(6)「make」を実行してコンパイルし、「make clean」を実行してクリーンアップし、「makedistclean」を実行して完全にクリーンアップします。

(7)コンパイルが成功すると、「xxxがビルドされました!」というプロンプトが表示されます。

(8)一般的なMakefileのソースコードの場所:[パート4]組み込みLinuxアプリケーション開発/ソース/ 05_general_Makefileの基本的な知識

 

12.一般的なMakefileの分析:セクション4-3-3、スキップさ
れたMakefile内のコマンドの意味とMakefileの設計アイデアの分析
については、第4章「基本」のセクション3.0.3およびセクション3.0.3を参照してください。組み込みLinuxアプリケーション開発の知識」セクション3.1

おすすめ

転載: blog.csdn.net/San_a_fish_of_dream/article/details/113256556