2016-07-14 46 views
0

我有一個makefile爲什麼編譯文件兩次

jumbo: objs/jumbo.o objs/utils.o 

objs/%.o: %.C 
    $(CXX) $(CFLAGS) $(CPPFLAGS) -c -o [email protected] $< 

編譯

g++  jumbo.C objs/jumbo.o objs/utils.o -o jumbo 
objs/jumbo.o:jumbo.C:(.text+0x0): multiple definition of `main' 
/tmp/ccwEFt9o.o:jumbo.C:(.text+0x0): first defined here 
collect2: error: ld returned 1 exit status 
make: *** [<builtin>: server] Error 1 

的結果,如果我取代的巨型

jumbo: jumbo.C objs/utils.o 

定義問題消失但目標文件不會被放在objs目錄中

我不知道它是否重新編譯巨大時,它應該只是重新連接

回答

0

您尚未定義任何用於構建目標jumbo的配方。因此,make會查找內置規則,並且知道如何從文件X.C構建文件X。看看目錄,看看,存在一個X.Cjumbo.C),所以請選擇使用該內置規則。內置的規則是:

%: %.C 
     $(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

如此,因爲jumbo取決於objs/jumbo.objs/utils.o目錄加上從默認隱含規則的jumbo.C,你在命令行上的所有三個。

爲了解決這個問題只需定義自己的食譜創建jumbo

jumbo: objs/jumbo.o objs/utils.o 
     $(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o [email protected]