2

私はここに簡単なmakefileを持っています:

SOURCES= $(wildcard *.c)
OBJECTS= $(patsubst %.c, %.o, $(SOURCES))
NAMES= $(patsubst %.c, %, $(SOURCES))
CC=gcc
CFLAGS= -Wall -c -o     
TASKS_IN_DIRS= $(addprefix obj/,$(OBJECTS)) $(addprefix bin/,$(NAMES))

all: $(NAMES)

$(NAMES): %: %.o $(OBJECTS)
    $(CC) -o bin/$@ obj/$^
$(OBJECTS): %.o: %.c 
    $(CC) $(CFLAGS) obj/$@ $<
clean:
    rm -rf $(TASKS_IN_DIRS)
  1. すべてのcファイル名を取得します。
  2. それらから単純な名前(拡張子なし)とオブジェクト名を作成します。
  3. 物事を行う

そして重要なのは-すべてが機能しますが、make(すべてのファイルのコンパイルとリンク)を印刷するたびに機能します。何も変更せず、数回続けて変更したとしても、依存関係に何か問題がありますか?

代わりに「blablaは最新です」のようなものを期待していました。

4

2 に答える 2

6
$(OBJECTS): %.o: %.c 
    $(CC) $(CFLAGS) obj/$@ $<

現在のディレクトリで.oファイルを探しています。彼らはそこにいないので、それは彼らを再建しています。

以下はあなたが望むことをします。

SOURCES= $(wildcard *.c)
OBJECTS:= $(patsubst %.c, %.o, $(SOURCES))
OBJECTS:= $(addprefix obj/,$(OBJECTS))
NAMES:= $(patsubst %.c, %, $(SOURCES))
NAMES:= $(addprefix bin/,$(NAMES))
CC=gcc
CFLAGS= -Wall -c -o
TASKS_IN_DIRS=$(OBJECTS) $(NAMES)

all: $(NAMES)

$(NAMES): $(OBJECTS)
    $(CC) -o $@ $<

obj/%.o: %.c
    $(CC) $(CFLAGS) $@ $<

clean:
    rm -rf $(TASKS_IN_DIRS)
于 2013-03-24T13:20:32.173 に答える
5

あなたは作るために嘘をついた。$(NAMES)各ターゲットが現在のディレクトリにオブジェクトファイルを作成することを約束しましたが、$(CC) -o bin/$@ obj/$^それが原因でディレクトリに作成されbinます。

次のmake呼び出しでは、オブジェクトファイルを見つけることができず、各コマンドを再度実行します。

Makefileの厳格なルール: PHONY以外の各ターゲットは$@、作成するファイルを示すために、コマンドのどこかでプレーンを使用する必要があります。

于 2013-03-24T13:43:23.317 に答える