C++ 需要";制造;使用vPath时两次

C++ 需要";制造;使用vPath时两次,c++,makefile,mingw,sdl,vpath,C++,Makefile,Mingw,Sdl,Vpath,在过去的两年左右的时间里,我一直在从事编程工作,我终于“走出了控制台”,但在我这样做的同时,我也想从IDE中独立出来,因此,我一直在学习make,但关于“vpath”的问题,我似乎找不到答案 这是我的makefile: vpath %.o obj vpath %.cpp src vpath %.h inc EXE = SDL_Game.exe OBJS = SDL_Game.o Init.o EventHandler.o INCDIR = -I"C:\SDL-1.2.15\include"

在过去的两年左右的时间里,我一直在从事编程工作,我终于“走出了控制台”,但在我这样做的同时,我也想从IDE中独立出来,因此,我一直在学习make,但关于“vpath”的问题,我似乎找不到答案

这是我的makefile:

vpath %.o obj
vpath %.cpp src
vpath %.h inc

EXE = SDL_Game.exe
OBJS = SDL_Game.o Init.o EventHandler.o

INCDIR = -I"C:\SDL-1.2.15\include" -Iinc
LIBDIR = -L"C:\SDL-1.2.15\lib"
LIBS = -lmingw32 -lSDLmain -lSDL

CFLAGS = $(INCDIR) -Wall
LDFLAGS = $(LIBDIR) $(LIBS) -Wall -mwindows

all: $(EXE)

$(EXE): $(OBJS)
    g++ -o bin/$@ $^ $(LDFLAGS)

%.o: %.cpp
    g++ -o obj/$@ -c $< $(CFLAGS)

SDL_Game.o: SDL_Game.h
Init.o: SDL_Game.h
EventHandler.o: SDL_Game.h

.PHONY: clean

clean:
    rm -f bin/* obj/*
我需要用第二次来连接程序。为什么呢? 我不应该使用“vPath”吗 这也是我在第二次制作中得到的:

C:\...\SDL_Test>make
g++ -o bin/SDL_Game.exe obj/SDL_Game.o obj/Init.o obj/EventHandler.o -L"C:\SDL-1
.2.15\lib" -lmingw32 -lSDLmain -lSDL -Wall -mwindows

(成功)

无法使用vpath查找对象文件。它只能正确用于查找源文件。除了
$@
,任何makefile配方都不应构建任何目标;该变量扩展到make希望您的配方生成的文件。如果它创建了一个不同的文件,那么你就不能维护你与make签订的合同

您需要更改makefile,如下所示:

OBJS = SDL_Game.o Init.o EventHandler.o

EXE = bin/SDL_Game.exe
以及:

$(EXE):$(addprefix obj/,$(OBJS))
$(CXX)-o$@$^$(LDFLAGS)
obj/%.o:src/%.cpp
$(CXX)-o$@-c$<$(CFLAGS)

有很多不同的方法可以做到这一点,但这只是一个开始。您还应该阅读

第一个
make
是在
SDL\u测试中开始的,第二个是在
SDL\u My\u方式中开始的
,这对吗?我的错误,编辑了它
OBJS = SDL_Game.o Init.o EventHandler.o

EXE = bin/SDL_Game.exe
$(EXE): $(addprefix obj/,$(OBJS))
        $(CXX) -o $@ $^ $(LDFLAGS)

obj/%.o : src/%.cpp
        $(CXX) -o $@ -c $< $(CFLAGS)