0

簡単にするために、次のフォルダーがあるとします。

  • ./src/多くの .c ファイル
  • ./obj/多くの .obj ファイル
  • ./output/ビルドしたいバイナリで

私のメイクファイルは次のとおりです。

all: init mybin

# init commands
init:
    mkdir obj
    mkdir output

mybin:  project1 project2 project3
    $(CC) src/misc.c ... etc
    $(LK) obj/first.obj obj/second.obj obj/third.obj obj/four.obj obj/five.obj obj/six.obj obj/seven.obj obj/eight.obj obj/nine.obj -o output/myapp.bin

project1: obj/first.obj obj/second.obj obj/third.obj

obj/first.obj: src/first.c
    $(CC) first.c ... etc

obj/second.obj: src/second.c
    $(CC) obj/second.c ... etc

obj/third.obj: src/third.c
    $(CC) obj/third.c ... etc


project2:   obj/four.obj obj/five.obj obj/six.obj

obj/four.obj: src/four.c
    $(CC) four.c ... etc

obj/five.obj: src/five.c
    $(CC) obj/five.c ... etc

obj/six.obj: src/six.c
    $(CC) obj/six.c ... etc


project3:   obj/seven.obj obj/eight.obj obj/nine.obj

obj/seven.obj: src/seven.c
    $(CC) seven.c ... etc

obj/eight.obj: src/eight.c
    $(CC) obj/eight.c ... etc

obj/nine.obj: src/nine.c
    $(CC) obj/nine.c ... etc

初めて実行したときmake all、コンパイルされたすべてが見つかりました。それから私はしました:

$ touch src/four.c
$ make all
$

しかし、make 何もコンパイルせずに終了します。.c ファイルの 1 つが変更されたことは検出されなかったと思いますが、依存関係の何が問題なのかわかりません。

私が期待したこと:
touchingは古いものとしてsrc/four.cマークされているはずであり、したがって、古いものとしてもマークされているはずです。このチェーンは、to の新しいコンパイルをトリガーし、プロジェクト全体の新しいリンケージをトリガーする必要があります。obj/four.objproject2mybinsrc/four.cobj/four.obj

4

1 に答える 1

1

コンパイルの出力ファイルを指定しましたか (おそらく-oオプション)? デフォルトでは (ほとんどのツールチェーンで)、ファイルをコンパイルすると、ファイルではなく.cファイルが生成されます。.o.obj

アップデート。

いくつかの前提条件が変更されたときに Make の更新ターゲットを取得するには、Make がタイムスタンプを使用してファイルが変更されたかどうかを判断する限り、ファイル間の正確な依存関係を提供する必要があります。

つまり、いわゆるtargetsallのままにすることもできますが、残りのターゲットをファイルにすることをお勧めします。init.PHONY

OUT_DIR := ./output
SRC_DIR := ./src
OBJ_DIR := ./obj

MYBIN := $(OUT_DIR)/myapp.bin

OBJS := $(addprefix $(OBJ_DIR)/, \
    first.obj \
    second.obj \
    third.obj \
    four.obj \
    five.obj \
    six.obj \
    seven.obj \
    eight.obj \
    nine.obj)

.PHONY : all mkdir-output mkdir-obj
all : $(MYBIN)

mkdir-output :
    @mkdir -p $(OUT_DIR)

mkdir-obj :
    @mkdir -p $(OBJ_DIR)

$(MYBIN) : $(OBJS) | mkdir-output
    $(LK) $^ -o $@

$(OBJS) : | mkdir-out
$(OBJS) : $(OBJ_DIR)/%.obj : $(SRC_DIR)/%.c
    $(CC) $< -object=$@ $(CC_OPT)

最後のルールは GNU Make のstatic pattern ruleです。そして、mkdir-xxxパイプサインの後の前提条件|注文のみです。

于 2012-04-24T14:28:35.690 に答える