2016-08-03 34 views
0

我試圖將目標文件(.o文件)生成到一個單獨的文件夾中。它運作良好。問題是生成的目標文件沒有放入我想要的文件夾中。以下是我的makefile:把目標文件放到一個單獨的文件夾中GNU make

OBJDIR :=objdir 
SOURCES=$(wildcard ./src/*.c) 
OBJS=$(patsubst %.c, %.o, $(SOURCES)) 
vpath %.h ./src 
vpath %.c ./src 
optest : $(OBJS) 
    cc -o optest $(OBJS) 
$(OBJDIR)/main.o : add.h mul.h did.h 
$(OBJDIR)/add.o : add.h 
$(OBJDIR)/mul.o : mul.h 
$(OBJDIR)/did.o : did.h 

$(OBJS): | $(OBJDIR) 

$(OBJDIR): 
    mkdir $(OBJDIR) 


clean : 
    rm -rf $(OBJDIR) 
    rm -f optest 

我的.h和.c文件被放在./src文件夾中。上面的makefile的結果是所有的目標文件都放在./src文件夾中,而不是objdir文件夾。任何人都可以提出任何建議嗎?

+0

您正在覆蓋'%.c':這裏的文件的規則:'$(OBJDIR)/main.o:add.h mul.h did.h' –

回答

1

兩個問題:你沒有正確地替換你的源文件,編譯的隱含規則只適用於具有匹配路徑的對象和源。

objdir := objdir 
sources := $(wildcard src/*.c) 
objs := $(sources:src/%.c=$(objdir)/%.o) 
deps := $(objs:.o=.d) 

CPPFLAGS := -MMD -MP 

.PHONY: clean 

optest: $(objs) 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 

$(objs): $(objdir)/%.o: src/%.c | $(objdir) 
    $(COMPILE.c) $(OUPUT_OPTION) $< 

$(objdir): ; mkdir [email protected] 

clean: ; $(RM) $(objs) $(deps) optest 

-include $(deps) 

其他的東西:

  • 回收內建的食譜,而不是滾動您自己
  • 使用依存產生,而不是指定每個依賴人工
  • 不要刪除整個目錄,即使你創建它們,堅持生成文件所負責的文件
  • 實際上不生成文件的規則應該是.PHONY
相關問題