为什么我的Makefile会给我带来麻烦?

时间:2014-09-14 17:08:10

标签: function class makefile header-files

我应该编写一个Makefile,它可以实现" make all"执行testimage和testscene。但是,如果我想要,我可以做,testcene或testimage只编译testimage。但是为什么我得到错误,下面,我一直在使用makefile,这可能意味着它不起作用。

EXENAME = testscene
OBJS = testscene.o scene.o image.o png.o rgbapixel.o

EXENAME = testimage
OBJS = testimage.o scene.o image.o png.o rgbapixel.o

CXX = clang++
CXXFLAGS = -std=c++1y -stdlib=libc++ -c -g -O0 -Wall -Wextra -pedantic
LD = clang++
LDFLAGS = -std=c++1y -stdlib=libc++ -lpng -lc++abi

all : testimage testscene

$(EXENAME) : $(OBJS)
    $(LD) $(OBJS) $(LDFLAGS) -o $(EXENAME)

testscene: testscene.o scene.o image.o png.o rgbapixel.o
    $(LD) testscene.o scene.o image.o png.o rgbapixel.o $(LDFLAGS) -o testscene

testimage: testimage.o scene.o image.o png.o rgbapixel.o
    $(LD) testimage.o scene.o image.o png.o rgbapixel.o $(LDFLAGS) -o testimage

testscene.o : testscene.cpp scene.h image.h png.h rgbapixel.h
    $(CXX) $(CXXFLAGS) testscene.cpp

scene.o: scene.h image.h png.h rgbapixel.h
    $(CXX) $(CXXFLAGS) scene.cpp

testimage.o : testimage.cpp image.h png.h rgbapixel.h
    $(CXX) $(CXXFLAGS) testimage.cpp

image.o : image.cpp image.h png.h rgbapixel.h
    $(CXX) $(CXXFLAGS) image.cpp

png.o : png.cpp png.h rgbapixel.h
    $(CXX) $(CXXFLAGS) png.cpp

rgbapixel.o : rgbapixel.cpp rgbapixel.h
    $(CXX) $(CXXFLAGS) rgbapixel.cpp
clean :
    -rm -f *.o $(EXENAME)
2@linux-a1 mp2]$ vi Makefile
2@linux-a1 mp2]$ make
Makefile:21: warning: overriding commands for target `testimage'
Makefile:15: warning: ignoring old commands for target `testimage'
make: Nothing to be done for `all'.
2@linux-a1 mp2]$ 

感谢

1 个答案:

答案 0 :(得分:3)

真的?您是否看过提供错误消息的两行?

在第15行,您有一个$(EXENAME) : $(OBJS)规则,其中EXENAME变量设置为testimage(在第一行中覆盖并使之前的EXENAME设置失效)。

然后在第21行,您有testimage: testimage.o scene.o image.o png.o rgbapixel.o的其他规则。

因此错误。