2016-05-13 97 views
0

我遇到了此生成文件的問題。我希望每個.cpp文件都得到一個依賴項.hpp例如:一個文件main.cpp有一個依賴項main.hpp爲什麼在更改.hpp文件時無法生成此生成文件

makefile運行良好,但是當我修改main.hpp時,make不重建。

有人可以給我一個提示。謝謝

objetivo=control 
objetos=$(shell ls *.cpp | sed 's/cpp/o/') 
optimizacion=-O2 -pipe 
enlaces=-lncurses -lmenu -lpq -lform -lcdkw 
CPP=g++ -std=c++11 -Wall 

.PHONY: all clean debug rebuild 

all: $(objetivo) 

.cpp.o: $*.hpp 
    $(CPP) $(optimizacion) -c $< 

debug: CPP += -g 
debug: optimizacion= 
debug: $(objetivo) 

rebuild: clean all 

$(objetivo): $(objetos) 
    $(CPP) -o [email protected] $(enlaces) $(objetos) 

clean: 
    -rm *.o $(objetivo) 
+0

使用'$(shell ls)'是非常成問題的,您的'sed'腳本不精確。你想'$(patsubst%.cpp,%。o,$(通配符* .cpp))' – tripleee

+0

謝謝。我將改變shell的功能。 – olafito18

回答

1

您的解決方案是不正確的。現在.o將在.hpp文件更改時重建,但當.cpp文件更改時將不會重建!

如果你想有兩個不同的先決條件,你必須列出他們兩個:

%.o: %.cpp %.hpp 
     $(CPP) $(optimizacion) -c $< 

注意CPP不是C++編譯器通常的變量;標準變量是CXX

您的第一次嘗試不起作用的原因是舊式後綴規則不允許任何先決條件。詳情請參閱手冊。

+0

你是對的!第二天我注意到了這個問題。謝謝 – olafito18

0

我找到了解決方案。

我更換了規則.ccp.o到:

%.o: %.hpp %.cpp 
     $(CPP) $(optimizacion) -c $*.cpp 

現在每次我修改了相關的HPP make重新匹配的.cpp

還是要謝謝你

+0

'rebuild'因爲並行構建('-j')而中斷,您也不需要調用'shell'來獲取目標文件列表,'$(patsubst%.cpp,%。o,$(通配符* .cpp))'會做同樣的事情。 – user657267

+0

我沒有注意到重建失敗。你是對的。非常感謝。 – olafito18