GNU make иногда не выполняет поиск в папках, объявленных в VPATH

Я пытаюсь построить небольшой проект C ++ с GNU make (версия 3.81) но я должен позвонить делать два раза, потому что первый запуск не удался. Это мой каталог проектов:

project
makefile
include
lexer.hpp
src
main.cpp
lexer.l

Следующее — мой make-файл:

CC = g++
CPPFLAGS = -I include
VPATH = include src

OBJECTS = main.o lexer.o

test: $(OBJECTS)
$(CC) $(CPPFLAGS) -lfl -o $@ $^

main.o: lexer.hpp main.cpp
$(CC) -c $(CPPFLAGS) $^

lexer.o: lexer.cpp
$(CC) -c $(CPPFLAGS) $^

lexer.cpp: lexer.l
flex -t $^ > src/lexer.cpp

.PHONY: clean

clean:
rm -fR $(OBJECTS) src/lexer.cpp test

В первый раз я бегу делать я получаю следующий вывод, где делать жалуется на отсутствие файла lexer.cpp. Но я не понимаю почему делать не ищите в папках, объявленных в VPATH.

g++ -c -I include include/lexer.hpp src/main.cpp
flex -t src/lexer.l > src/lexer.cpp
g++ -c -I include lexer.cpp
g++: error: lexer.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [lexer.o] Error 1

Однако, если я позвоню делать снова, тогда lexer.cpp найден и компиляция работает.

g++ -c -I include src/lexer.cpp
g++ -I include -lfl -o test main.o lexer.o

Зачем?

Постскриптум Я извиняюсь за плохой английский.

0

Решение

Это правило неверно:

lexer.cpp: lexer.l
flex -t $^ > src/lexer.cpp

Это правило говорит make, что он создаст файл lexer.cpp, и вот что make ожидает от него, и после завершения правила make думает, что файл готов к работе, и будет использовать это имя файла, когда другие цели зависят от него. Но то, что действительно делает правило, это сборка src/lexer.cpp,

Чтобы правильно написать это правило, вам нужно написать его так:

src/lexer.cpp: lexer.l
flex -t $^ > $@

(каждое написанное вами правило make должно всегда обновлять файл $@, именно так).

Однако в целом VPATH не подходит для поиска сгенерированных файлов (объектных файлов и т. Д. Любого файла, сгенерированного make). Это полезно только для поиска исходных файлов (файлы make не создает себя).

2

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

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

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