個々のプログラムごとにすべてのCコードファイルをコンパイルするための単純なMakefile
Simple Makefile Compile All C Code Files
私は初心者ですMakefile
プロジェクトの編集を容易にするために使用され、記録します。質問がある場合は、訂正してください。ファイルの内容は記事の最後に添付されています。
この記事の目的
私はここにいます./src/
ディレクトリにいくつかあります.c
ファイル、各ファイルをコンパイルしたい、中間コードファイル*.o
put ... in ./build/obj/
次に、ターゲット実行可能ファイルは./build/
の下に配置されます
Makefileワークフロー
- 出力項目が指定されていない場合、Makefileは、たとえば、この記事のように、偽のターゲットであっても、構築するすべてのターゲットの中からワイルドカードのない最初のターゲットを最初に見つけます
all
- 構造によると
all
構築する必要のあるルール$(BUILD)
、および$(BUILD)
つまり$(BUILD_DIR)
接尾辞のない実行可能ファイル - したがって、構築される目標は
$(OBJ_DIR)/%.o
になり、ルールを検索し続けて、一致するルールを見つけます$(BUILD_DIR)/%: $(OBJ_DIR)/%.o
、しかし残念ながら、ルールはOBJS := $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
に依存しているので、探し続けてください - 以下で再度見つかりました
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
、検索を続行する必要はありません。つまり、このルールに基づいてステートメントを実行してコンパイルしますが、リンクはしません。 - 完了後、上位レベルに戻ってチェック
.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 [email protected] $<# Link each *.o file as executable files $(BUILD_DIR)/%: $(OBJ_DIR)/%.o @echo + LD roo[email protected] @mkdir -p $(BUILD_DIR) @$(LD) $(CFLAGS) -o [email protected] $<.PHONY: all clean clean: rm -rf $(BUILD_DIR)