Итак, я пытаюсь понять make-файлы. На данный момент у меня есть проект с некоторыми модулями, которые более или менее не зависят друг от друга.правильное использование makefile
Моего дерева каталогов, как это:
root/
- Source/ <-- referenced as $(INPUTPATH)
- Build/ <-- referenced as $(BUILDPATH)
- Release/ <-- referenced as $(OUTPUTPATH)
- Makefile
Я хочу, чтобы иметь источник (.cpp/ .h) от источника /, объектов на Build /, и исполняемый в данном Выпуск/*.
Итак, моя идея состояла в том, чтобы иметь несколько различных целей, и использовать их как это:
all: maps auxiliars methods
@echo "linking...";\
$(CC) $(CFLAGS) $(OBJS) $(CLIBS) -o ${OUTPUTPATH}/MainProgram
dependency1: $(INPUTPATH)/foo.cpp
@echo "compiling ArbPrecision...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$?
dependency2: dependency1 $(INPUTPATH)/bar.cpp
@echo "compiling saddleConstructor...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$(INPUTPATH)/bar.cpp
maps: dependency2 $(INPUTPATH)/*Map.cpp
@echo "compiling maps...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$(INPUTPATH)/*Map.cpp
... (auxiliars and methods)
в $ CINCLUDE и CFLAGS просто компилятор такие вещи, как заголовки и внешние LIBS.
Все работает почти идеально: на каждой цели он запрашивает зависимости другой цели и для * cpp на источнике. Если этого не существует, он вызывает цель и компилирует * cpp. Исполняемый файл создается без ошибок.
Однако, если я дважды вызываю «make», время, которое требуется для компиляции, одинаково для первого и второго времени, даже если я не вношу никаких изменений в источник. Так что, по-видимому, я не правильно задаю зависимости.
Может ли кто-нибудь указать мне правильное направление для выполнения этой подборки? Я делаю что-то неправильно, и я не понимаю, что это такое.
Спасибо, Jorge
При компиляции входной файл является исходным файлом (то есть .cpp-файлом), а выход представляет собой объектный файл (обычно файл .o или .obj). Вот где вы должны быть зависимыми. Вы должны сказать, что bar.o зависит от bar.cpp и т. Д. Аналогично, шаг привязки, ваша программа зависит от группы объектных файлов, поэтому они должны быть определены в зависимостях для 'all'. – john