c++ - 使用 vpaths 时需要两次 "make"

标签 c++ makefile mingw sdl vpath

在过去的 2 年左右的时间里,我一直在从事编程工作,我终于“摆脱了控制台”,但在这样做的同时,我也想独立于 IDE,因此,我一直学习 make 但这是一个问题,我似乎无法找到有关“vpath”的答案

这是我的生成文件:

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

而且我需要再次使用 make 来使程序链接。这是为什么 ? 我不应该使用“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 期望您的配方构建的文件。如果它创建了一个不同的文件,那么你就没有维护你与 make 签订的契约(Contract)。

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

关于c++ - 使用 vpaths 时需要两次 "make",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17013577/

相关文章:

c++ - 编译酷项目中的语法错误

c - 错误 : called object ‘0’ is not a function

makefile - 尝试不同方法来制作目标的标准 makefile 习语是什么

c++ - cmakelists.txt - 结合现有的 Makefiles

c++ - 未通过路径变量识别 MinGW

c++ - 使用 CUDA 对相同数据进行 FFT 每次都会给出不同的结果?

c++递归大数以查找mod

c++ - 如何判断 wchar_t 是否有代理项(UTF-16)?

c++ - OpenGL3.3 中的代码不在正交投影中渲染纹理

mingw - 有没有一种方法可以在不安装MinGW的情况下运行使用MinGW编译的.exe?