这是我的目录结构:
$ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
.
|-Build
|---Bin
|-Include
|-Lib
|-Source
这是我的makefile:
Gaurav@Gaurav-PC /cygdrive/d/Pizza/Build
$ pwd
/cygdrive/d/Pizza/Build
Gaurav@Gaurav-PC /cygdrive/d/Pizza/Build
$ ls
Bin Makefile
Gaurav@Gaurav-PC /cygdrive/d/Pizza/Build
$vim Makefile
INCLUDES= ./../Include
OBJDIR= ./Bin
SRCDIR= ./../Source
vpath %.h $(INCLUDES)
vpath %.cpp $(SRCDIR)
vpath %.o $(OBJDIR)
CXX= g++
CXXFLAGS= -Wall -c -I$(INCLUDES)
OBJECTS= Pizza.o PizzaClassMain.o
Pizza: $(OBJECTS)
$(CXX) -Wall $^ -o $(OBJDIR)/$@
PizzaClassMain.o:PizzaClassMain.cpp Pizza.h
$(CXX) $(CXXFLAGS) $< -o $(OBJDIR)/$@
Pizza.o: Pizza.cpp Pizza.h
$(CXX) $(CXXFLAGS) $< -o $(OBJDIR)/$@
.PHONY: clean
clean:
rm -f $(OBJDIR)/*.o $(OBJDIR)/*.exe *~ .Makefile.un~
我得到以下错误:
$ make
g++ -Wall -c -I./../Include ./../Source/Pizza.cpp -o ./Bin/Pizza.o
g++ -Wall -c -I./../Include ./../Source/PizzaClassMain.cpp -o ./Bin/PizzaClassMain.o
g++ -Wall Pizza.o PizzaClassMain.o -o ./Bin/Pizza
g++: error: Pizza.o: No such file or directory
g++: error: PizzaClassMain.o: No such file or directory
g++: fatal error: no input files
compilation terminated.
Makefile:18: recipe for target 'Pizza' failed
make: *** [Pizza] Error 1
我已经在
vpath %.o $(OBJDIR)
中放入了Makefile
,但是rule: Pizza
和Pizza.o
仍然无法找到PizzaClassMain.o
和./Bin
,尽管它们是根据规则Pizza.o
和PizzaClassMain.o
在目录g++ -Wall g++ -Wall Pizza.o PizzaClassMain.o -o Pizza
中正确创建的如果我从目录
./Bin
手动运行Pizza
,则可以正常工作。我无法弄清楚为什么规则
input files
无法找到cygwin
?谁能帮忙吗?
PS:这个Makefile确实成功编译了40次,但是一次成功编译了两次。
make
软件包是否存在一些问题? 最佳答案
您的对象应该是:
OBJECTS= ./Bin/Pizza.o ./Bin/PizzaClassMain.o
通过规则PIZZA,这些对象已成功编译:$(OBJECTS)找到正确的规则,名为“ Pizza.o”和“ PizzaClassMain.o”。这些只是规则的名称,不是实际的文件名。当Make实用程序寻找./Build/Pizza.o时,此文件不存在,也找不到。它是在./Build/Bin目录中创建的。