我应该编写一个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]$
感谢
答案 0 :(得分:3)
真的?您是否看过提供错误消息的两行?
在第15行,您有一个$(EXENAME) : $(OBJS)
规则,其中EXENAME
变量设置为testimage
(在第一行中覆盖并使之前的EXENAME
设置失效)。
然后在第21行,您有testimage: testimage.o scene.o image.o png.o rgbapixel.o
的其他规则。
因此错误。