Увидев, что вы новичок в этом, я проведу вас через него, чтобы вы научились делать это в первый раз. Там очень много мелких деталей, что много людей, в конечном итоге не хватает, так что надеюсь, это даст вам хорошую рекомендацию:
Первую, позволяет начать с определения ваших объектов
OBJS := quest.o thorgrim.o
теперь вы можете создать шаблонное правило:
%.o: %.c
$(CC) $(CFLAGS) -MD -MP $< -c -o [email protected]
Первая строка этого правила %.o:%.c
говорит, что все, заканчивающееся .o
зависит от файла с тем же именем, заканчивающимся на .c
. Это не позволяет вам писать отдельное правило для каждого объектного файла. Обратите внимание, что для этого есть правило шаблона по умолчанию, но мы не будем здесь останавливаться.
Далее вы звоните $(CC)
с номером $(CFALGS)
. Обратите внимание, что [email protected]
теперь представляет имя файла .o, который вы генерируете, и $<
представляет собой первую зависимость объекта (файл .c в этом случае).
-MD
и -MP
используются для автоматической генерации файлов зависимостей - для каждого .c
файла он также создаст .d
файл, в котором перечислено зависимости (.h
файлов), что ваш источник требует, чтобы построить. У вас должно быть -include
файлы зависимостей для его работы. (см. https://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/Preprocessor-Options.html для более подробной информации о том, что они делают). Таким образом, если вы измените файл заголовка, он автоматически перестроит необходимые файлы .o
. Сказав это, вы должны включить эти .D файлов в Makefile:
-include $(OBJS:.o=.d)
Это будет включать .D файлы, как если бы кто-то вырезать и вставить код в свой Makefile.$(OBJS:.o=.d)
просто приказывает сделать взять OBJS
и заменить все .o
на .d
. Обратите внимание на -
перед включением. Это говорит о том, что не стоит беспокоиться о том, что файл не существует (как это будет в случае вашей первой сборки ...).
Хорошо, теперь, когда у вас есть ваши .o файлы построили, вы должны построить свою программу:
$(EXE): $(OBJS)
$(CC) $^ -o [email protected]
Добавить правило и комментарии по умолчанию, и вы сделали. Итак, в общем, ваш make-файл будет выглядеть примерно так:
CC:=gcc
EXE:=battle
CFLAGS:=-Wall
OBJS:=quest.o thorgrim.o
%.o: %.c
$(CC) $(CFLAGS) -MD -MP $< -c -o [email protected]
$(EXE): $(OBJS)
$(CC) $^ -o [email protected]
clean:
rm -f $(OBJS) $(EXE)
-include $(OBJS:.o=.d)
EDIT: забыли правильное правило - добавив, что.
Ну, вы бежите и ссылка * в одной и той же цели *, так что нет никакого способа сделать одно без другого. Возможно, вы захотите иметь * compile * ← * link * ← * run * зависимость. – Biffen
Ваша проблема: make переходит к компиляции 'run' и предполагает, что' run' является фактическим выходным файлом, созданным правилом, а не только тем, что вы создали. Следовательно, он не находит файл под названием 'run' и компилирует. – Blacksilver
Ты мой герой! Через 7 часов это простое объяснение было единственным, что мне было нужно. Наш учитель сказал мне, что это слишком сложно, и я должен спросить на форуме университета. Еще раз спасибо, сэр! – Shavoks