Нужно & quot; сделать & quot; дважды при использовании vpaths

Я занимаюсь программированием последние два года или около того, и я наконец-то «вырываюсь из консоли», но, делая это, я также хочу стать независимым от IDE, поэтому я изучаю make, но вот проблема, на которую я не могу найти ответ относительно «vpath» s

вот мой make-файл:

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 в первый раз, когда использую 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

(Success)

0

Решение

Вы не можете использовать vpath для поиска объектных файлов. Он может быть правильно использован только для поиска исходных файлов. Никакой рецепт makefile никогда не должен создавать какую-либо цель кроме $@; эта переменная расширяется до файла, который make ожидает от вашего рецепта. Если он создает другой файл, значит, вы не соблюдаете окончание контракта, заключенного с make.

Вам нужно изменить ваш make-файл, например, так:

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]