2016-05-13 95 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