1

次のディレクトリ構造があります。

root-----Makefile
   |-----src  #all source files here.
   |-----obj  #all object files here.
   |-----bin  #the final target.

の内容をMakefile以下に示します。

TARGET  =       exec

CC              =       gcc
CFLAGS  =       -g -I.
LINKER  =       gcc -o
LFLAGS  =       -I. -lm -lpthread

BINDIR  =       bin
OBJDIR  =       obj
SRCDIR  =       src
INTERFACE =     interface
STD     =       -std=c99

PROGRAMSOURCES  :=      $(wildcard $(SRCDIR)/*.c)
PROGRAMINTERFACE:=      $(wildcard $(INTERFACE)/*.h)
OBJECTS         :=      $(PROGRAMSOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)

$(BINDIR)/$(TARGET)     :       $(OBJECTS)
        $(LINKER) $@ $(LFLAGS) $(OBJECTS) $(STD)

#pull the dependencies to the .o files
-include $(OBJECTS:.o=.d)

$(OBJECTS)              :       $(OBJDIR)/%.o :$(SRCDIR)/%.c
        $(CC) $(CFLAGS) -c $< -o $@ $(STD)
        $(CC) $(CFLAGS) -MM $< > $*.d
        @mv -f $*.d $*.d.tmp
        @sed -e 's|.*:|$(OBJDIR)/$*.o:|' < $*.d.tmp > $*.d
        @sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
         sed -e 's/^ *//' -e 's/$$/:/' >> $*.d`
        @rm -f $*.d.tmp`

.PHONY  :       run
run             :`
        ./$(BINDIR)/$(TARGET) ${TYPE} ${INP_FILE}

ここで使用したチュートリアルは、対応するディレクトリ構造に合わせて変更されています。しかし、変更で何かが間違っていて、何が理解できません。ファイルで生成された依存関係リストは.d考慮されません。つまり、ルールを変更する.hとコンパイルされません。

4

1 に答える 1

0

で依存関係ファイルを作成しているようですがroot/、でそれらを探していますobj/

これを変更してみてください:

-include $(OBJECTS:.o=.d)

これに:

-include *.d

makefile が機能するようになれば、他にも改善できることがあります。

編集:さらなる改善

1) 依存関係ファイルを配置する場所の選択は主に任意ですが、それらを に配置すると、ルールobj/を大幅に簡素化できます。$(OBJECTS)

-include $(OBJDIR)/*.d

$(OBJECTS): $(OBJDIR)/%.o :$(SRCDIR)/%.c
    $(CC) $(CFLAGS) -MMD -MP -c $< -o $@ $(STD)

2)使用されPROGRAMINTERFACEINTERFACEいないため、削除できます。

3)そのまま入れる-oLINKERは危険です。そして、自動変数を忘れないでください$^:

LINKER = gcc
$(BINDIR)/$(TARGET) : $(OBJECTS)
    $(LINKER) $@ $(LFLAGS) $^ $(STD)

4) 前提条件を与えるrunのが賢明でしょう:

run: $(BINDIR)/$(TARGET)
    ./$< ${TYPE} ${INP_FILE}
于 2013-05-19T23:12:08.377 に答える