2014-03-27 25 views
0

我已經得到了我成功之前,用於小(個人)的項目通用的makefile,如下失敗以下目錄結構:GNU使花紋與規則「Main.cpp的」

ParentFolder/ 
    Makefile 
    hdr/ 
     file1.h 
     ... 
    src/ 
     file1.cpp 
     ... 
    obj/ 

我給makefile文件給同事,他們發現它沒有工作 - 經過一番調查,問題的原因似乎是,他們有一個源文件中被稱爲main.cppsrc/,運行時make將提供以下錯誤:如果我重新命名main.cpp到別的

make: *** No rule to make target `obj/main.o', needed by `MyProgram'. Stop. 

(例如test.cpp),那麼makefile按預期工作。

這種行爲的原因是什麼?我已經瀏覽了GNU Make Manual,但沒有發現任何關於文件main.*的特殊處理(實際上,有些示例使用它)的任何內容。

在試圖解決問題時,我發現爲main.o定義明確的規則意味着它將被發現 - 因此,我認爲它是與名稱和基於模式的規則的交互,但我一直未能找出可能的結果。

回答

1

麻煩的是,這條規則:

obj/%.o: src/%.cpp %.d hdr/%.h 
    echo [email protected] 
    $(CXX) $(INCLUDES) -o [email protected] -c $< $(ROOTFLAGS) 

需要相應的頭文件。我懷疑沒有hdr/main.h,並且Make沒有辦法構建一個,所以當它正在尋找一種方法來構建obj/main.o時,它認爲這個規則拒絕它,並且找不到其他方法。

我建議你添加其他方式規則(後這一個)來處理源文件中沒有匹配的頭文件:

obj/%.o: src/%.cpp %.d 
    echo [email protected] 
    $(CXX) $(INCLUDES) -o [email protected] -c $< $(ROOTFLAGS) 

(PS你所依賴的處理是一個有些奇怪,似乎是退化 - 你生成依賴文件並且從不使用它們,一旦你正確地構建了main.o,我們可以幫助你。)

+0

啊,非常感謝!添加規則修復了問題 - 事實證明,當我將'main.cpp'重命名爲'test.cpp'時,首先查看了另一個以s開頭的文件,這是編譯失敗的原因,因此我從未看到「沒有匹配規則「test.o錯誤,並認爲問題已修復。 我很樂意爲依賴文件提供幫助。我以爲我正確使用它們,但也許不是。 – Wheels2050

+0

我應該補充說,我適應了我的Makefile從一個發現[這裏](http://stackoverflow.com/questions/313778/generate-dependencies-for-a-makefile-for-a-project-in-c-c) – Wheels2050