個々のプログラムごとにすべてのCコードファイルをコンパイルするための単純なMakefile



Simple Makefile Compile All C Code Files



私は初心者ですMakefileプロジェクトの編集を容易にするために使用され、記録します。質問がある場合は、訂正してください。ファイルの内容は記事の最後に添付されています。

この記事の目的

私はここにいます./src/ディレクトリにいくつかあります.cファイル、各ファイルをコンパイルしたい、中間コードファイル*.o put ... in ./build/obj/次に、ターゲット実行可能ファイルは./build/の下に配置されます



Makefileワークフロー

  1. 出力項目が指定されていない場合、Makefileは、たとえば、この記事のように、偽のターゲットであっても、構築するすべてのターゲットの中からワイルドカードのない最初のターゲットを最初に見つけますall
  2. 構造によるとall構築する必要のあるルール$(BUILD)、および$(BUILD)つまり$(BUILD_DIR)接尾辞のない実行可能ファイル
  3. したがって、構築される目標は$(OBJ_DIR)/%.oになり、ルールを検索し続けて、一致するルールを見つけます$(BUILD_DIR)/%: $(OBJ_DIR)/%.o、しかし残念ながら、ルールはOBJS := $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)に依存しているので、探し続けてください
  4. 以下で再度見つかりました$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c、検索を続行する必要はありません。つまり、このルールに基づいてステートメントを実行してコンパイルしますが、リンクはしません。
  5. 完了後、上位レベルに戻ってチェック.oファイルリンクを確認し、引き続き上位層に戻ります。このプロセスを繰り返して、各$(BUILD)の目標が生成されるようにします。

中間ファイルを削除しないでください

上記のプロセスは、すべてのコンパイルが完了した後に使用されますrm中間プロセスファイルを削除するコマンド。ターゲットファイルのみを保持し、追加できます。

.SECONDARY: $(OBJS)

Let $(OBJS)クリーンアップされないように、2番目のターゲットになります



書き込みcleanメソッド

プロジェクトをクリーンアップする必要がある場合があります。このときは、clean疑似ターゲットに書き込み、その実装を最後のターゲットに配置するだけです。実装は非常に簡単です。つまり、rmコンパイルプロセスファイルと結果ファイルをクリーンアップします。

より推奨されるプロジェクトツリー構成

. ├── build │ ├── Several executable files │ └── obj │ └── Several .o intermediate code files ├── LICENSE ├── Makefile ├── README.md └── src └── Several c source files

添付ファイル:Makefileの全文

# File paths SRC_DIR := ./src BUILD_DIR := ./build OBJ_DIR := $(BUILD_DIR)/obj # Compilation flags CC := gcc LD := gcc CFLAGS := -Wall # Files to be compiled SRCS := $(wildcard $(SRC_DIR)/*.c) OBJS := $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) BUILD := $(OBJS:$(OBJ_DIR)/%.o=$(BUILD_DIR)/%) # Don't remove *.o files automatically .SECONDARY: $(OBJS) all: $(BUILD) # Compile each *.c file as *.o files $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @echo + CC $<@mkdir -p $(OBJ_DIR) @$(CC) $(CFLAGS) -c -o root@xxxxx $<# Link each *.o file as executable files $(BUILD_DIR)/%: $(OBJ_DIR)/%.o @echo + LD root@xxxxx @mkdir -p $(BUILD_DIR) @$(LD) $(CFLAGS) -o root@xxxxx $<.PHONY: all clean clean: rm -rf $(BUILD_DIR)