在过去的两年左右的时间里,我一直从事编程工作,最终我“脱离了控制台”,但是当我这样做时,我也想独立于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/*


当我第一次使用make时,我得到以下结果:

C:\...\SDL_Test>make
g++ -o obj/SDL_Game.o -c src/SDL_Game.cpp -I"C:\SDL-1.2.15\include" -Iinc -Wall
g++ -o obj/Init.o -c src/Init.cpp -I"C:\SDL-1.2.15\include" -Iinc -Wall
g++ -o obj/EventHandler.o -c src/EventHandler.cpp -I"C:\SDL-1.2.15\include" -Iin
c -Wall
g++ -o bin/SDL_Game.exe SDL_Game.o Init.o EventHandler.o -L"C:\SDL-1.2.15\lib" -
lmingw32 -lSDLmain -lSDL -Wall -mwindows
g++.exe: error: SDL_Game.o: No such file or directory
g++.exe: error: Init.o: No such file or directory
g++.exe: error: EventHandler.o: No such file or directory
make: *** [SDL_Game.exe] Error 1


而且我需要使用第二次才能使程序链接。这是为什么 ?
我不应该使用“ vpaths”吗?
这也是我第二次得到的东西:

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签订的合同的期限。

您需要像下面这样更改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)


有很多不同的方法可以做到这一点,但这只是一个开始。您还应该阅读http://make.mad-scientist.net/vpath.html

10-08 07:45