web-dev-qa-db-ja.com

Makefile:.oファイルを別のフォルダーに保存して、すべてのcファイルを自動的にコンパイルします

私が持っているのは、3つのサブディレクトリを持つディレクトリです。 src /は.cファイルと.hファイル、bin /はコンパイルされた実行可能ファイルが移動する場所、obj /は.objファイルを移動する場所です。

ここで、メイクファイルでsrcのすべての.cファイルをコンパイルし(メイクファイルにすべてをリストする必要はありません)、. oファイルをobjに入れ、foo/cからビルドされた実行可能ファイルをbin/fooとして保存します。

誰かが私を助けてくれますか?ワイルドカードを使用するときは常に、そこに存在しないルールについて不平を言い、暗黙のルールを使用するとき、オブジェクトファイルを別のフォルダーに配置しません。

11
Max

ローカルで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.oobj/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つの大きな欠点があることに注意してください:は、ヘッダーファイルへの依存関係を追跡しません。これは自動的に実行できますが、微妙なトリックです。これだけ習得するまで待つことができます。

25
Beta