私が持っているのは、3つのサブディレクトリを持つディレクトリです。 src /は.cファイルと.hファイル、bin /はコンパイルされた実行可能ファイルが移動する場所、obj /は.objファイルを移動する場所です。
ここで、メイクファイルでsrcのすべての.cファイルをコンパイルし(メイクファイルにすべてをリストする必要はありません)、. oファイルをobjに入れ、foo/cからビルドされた実行可能ファイルをbin/fooとして保存します。
誰かが私を助けてくれますか?ワイルドカードを使用するときは常に、そこに存在しないルールについて不平を言い、暗黙のルールを使用するとき、オブジェクトファイルを別のフォルダーに配置しません。
ローカルでfoo.o
からfoo.c
をビルドするには:
foo.o: foo.c
$(CC) -c $< -o $@
同じことを行いますが、必要なヘッダーファイルをsrc/
に含めます。
SRC := src
foo.o: foo.c
$(CC) -I$(SRC) -c $< -o $@
同じことを行うには、ソースファイルをsrc/
に含めます。
SRC := src
foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o $@
これを行うには、オブジェクトファイルをobj/
に配置します。
SRC := src
OBJ := obj
$(OBJ)/foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o $@
そのようなオブジェクトファイル(obj/foo.o
、obj/bar.o
、...)に対してそれを行うパターンルール:
SRC := src
OBJ := obj
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o $@
目的のオブジェクトのリストを作成するには:
SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
そして、それらすべてをカバーするルール:
all: $(OBJECTS)
まとめると:
SRC := src
OBJ := obj
SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
all: $(OBJECTS)
$(CC) $^ -o $@
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o $@
これには1つの大きな欠点があることに注意してください:は、ヘッダーファイルへの依存関係を追跡しません。これは自動的に実行できますが、微妙なトリックです。これだけ習得するまで待つことができます。