У меня есть Makefile, который работает до сих пор. Хотя, по мере того как он начал расти, перекомпиляция всех источников каждый раз начиналась слишком долго. Вот отрывок из рабочей версии:Makefile - файл зависимостей в папке «Нет такого файла или каталога»
CC=$(CROSS_COMPILE)g++
CFLAGS=-Wall -I./include -pg -O2
VPATH=./src:./include
all: dotgazer.cpp dotgazer/Dot.cpp
$(CC) $(CFLAGS) $^ -o dotgazer.out `pkg-config --libs opencv`
Есть намного больше зависимостей, но эти два достаточно, чтобы показать, что проблема есть. Я пытаюсь переместить этап компиляции каждого файла cpp
в отдельную цель. Когда дело доходит до файла верхнего уровня (dotgazer.cpp
), это не проблема, и общее правило %.o: %.cpp
отлично работает. Но я не могу заставить вторую зависимость работать. Вот как это выглядит сейчас:
CC=$(CROSS_COMPILE)g++
CFLAGS=-Wall -I./include -pg -O2
VPATH=./src:./include
all: dotgazer.o dotgazer/Dot.o
$(CC) $(CFLAGS) $^ -o dotgazer.out `pkg-config --libs opencv`
%.o: %.cpp
$(CC) -c $(CFLAGS) $^ -o [email protected]
dotgazer/Dot.o: dotgazer/Dot.cpp
$(CC) -c $(CFLAGS) $^ -o [email protected]
Я пробовал различные вариации Dot.o
правил, но ни один из них не похоже на работу. Ошибка, которую я получаю с приведенной выше:
Fatal error: can't create dotgazer/Dot.o: No such file or directory
Как это сделать? Я бы предпочел иметь файлы .o
в тех же папках, что и их источники. Кроме того, я был бы благодарен за общие правила (например, %.o: %.cpp
), так как есть много исходных файлов, и я не хочу, чтобы Makefile слишком раздувался. Спасибо!
Я мог бы быть быть немым, но не '% .o:% .cpp' и' dotgazer/Dot.o: dotgazer/правила Dot.cpp' удвоение? Как, не последняя ли цель, уже обработанная первой? –
@AdamGoodwin Я думал, что он будет работать таким образом (требуется только правило '% .o:% .cpp'). Но получается - нет. Поэтому я добавил второе правило, особенно для второй зависимости, и он все еще не работает. Только с правилом '% .o:% .cpp', сообщение одно и то же:' невозможно создать dotgazer/Dot.o: нет такого файла или каталога' – Wojtek
Хм, я просто попробовал ваш make-файл, и он отлично работал для меня. Он работал даже с целью «% .o» и без цели «dotgazer/Dot.o». Вы не ошиблись с именем файла или каталогом? Или вы делаете что-то вроде запуска make-файла откуда-то, кроме своего собственного каталога? –