Makefile无法找到* .o文件来生成.exe文件

时间:2014-05-11 14:25:40

标签: c++ c linux compilation makefile

这是我的目录结构:

$ 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&amp; PizzaClassMain.o虽然规则./Bin&amp; Pizza.o正在目录PizzaClassMain.o中正确创建它们。 g++ -Wall g++ -Wall Pizza.o PizzaClassMain.o -o Pizza

如果我从目录./Bin手动运行Pizza,那么它可以正常运行。

我无法弄清楚规则input files无法找到cygwin的原因? 有人可以帮忙吗?

PS:这个Makefile确实编译成功一次或两次说出40次。 make包{{1}}是否存在问题?

2 个答案:

答案 0 :(得分:0)

你的对象应该是:

 OBJECTS= ./Bin/Pizza.o ./Bin/PizzaClassMain.o

这些对象已成功编译为规则PIZZA:$(OBJECTS)找到名为&#34; Pizza.o&#34;的正确规则。和#34; PizzaClassMain.o&#34;。这些只是规则的名称,而不是实际的文件名。当Make实用程序查找./Build/Pizza.o时,此文件不存在且找不到。它是在./Build/Bin目录中创建的。

答案 1 :(得分:0)

以下规则更改解决了问题:

Pizza: $(OBJECTS)
    $(CXX) -Wall $(addprefix $(OBJDIR)/,$^) -o $(OBJDIR)/$@ 

OliCharlesworth指出的非常好的文章http://mad-scientist.net/make/vpath.html