1

複数のディレクトリにあるプログラムをコンパイルするmakefileを作成しています。すべてのソースファイルは/srcにあり、ヘッダーは/ incにあり、オブジェクトファイルは/ objに作成され、実行可能ファイルは/binに作成されます。3つのmakefileがあり、全体として1つは/ objディレクトリにあり、もう1つは/binディレクトリにあります。obj makefileはオブジェクトファイルを作成し、binmakefileは実行可能ファイルを作成するファイルをリンクします。このmakefileは可能な限り一般的である必要があるため、値をハードコーディングすることは想定されていません。これには、ファイル名とディレクトリ名のハードコーディングが含まれます。

以下のコードは、オブジェクトファイルを作成するmakefileです。オブジェクトファイルを作成しますが、依存関係を適切にチェックしないため、1つのファイルを更新すると、すべてのオブジェクトファイルが再作成されます。GNU Makefileマニュアルを読んでいますが、何が問題になっているのかまだわかりません。

CC:= gcc
CCFLAGS:= -MMD -g -Wall
INCLUDE:= -I "../inc"
LDFLAGS:= -lcurses -lgdbm -lncurses -lgdbm_compat
SRC:= ../src

SOURCES:= $(wildcard $(SRC)/*.c)
OBJS:=$(patsubst $(SRC)/%.c,%.o,$(SOURCES))

all: $(OBJS)

$(OBJS): $(SOURCES)
    $(CC) $(CCFLAGS) $(INCLUDE) -c $^

VPATH= ../$(PROG)
$(SOURCES): 
    $(CC) $(CC_FLAGS) $(INCLUDE) -c $<

.PHONY: clean

clean:
    rm -f *.[od]  *.o

-include *.d

必要に応じて、他の2つのmakefileを投稿できます。

4

1 に答える 1

2

あなた$(OBJS)のルールでは、各オブジェクトファイルはすべてのソースファイルに依存しているため、1つのソースファイルを変更すると、Makeはすべてのオブジェクトを再構築します。これを試して:

$(OBJS): %.o : $(SRC)/%.c
    $(CC) $(CCFLAGS) $(INCLUDE) -c $<
于 2012-10-28T01:58:20.007 に答える