Ваш Makefile выглядит нормально - я не вижу проблем с ним как таковым [*]. Проблема в том, что ваш код компилируется.
Посмотрите на одну из ошибок, которые вы получаете:
obj / src / sv.o: в функции `main ':
sv.c :(. Text + 0xcb5): множественное определение `main '
obj / src / ag.o: ag.c :(. Text + 0x6ef): сначала определено здесь
То есть, у вас есть файл с именем "sv.c", в котором есть функция с именем main
. И что у вас есть другой файл с именем «ag.c», в котором также есть функция с именем main
. Вы пытаетесь скомпилировать оба этих файла в одну и ту же программу, но вам разрешено иметь только одну функцию с именем main
.
[*] Похоже, у вас в каталоге "src" живет несколько программ, и ваш Makefile пытается собрать все в одну гигантскую программу. Если это так, вам нужно либо разделить код на свои собственные каталоги, либо изменить свой Makefile, чтобы в SOURCES
отображались только исходные файлы, относящиеся к программе, которую вы компилируете.
Если вы хотите скомпилировать несколько программ в одном и том же Makefile, вам нужно разделить вещи. Каждая программа нуждается в собственном правиле сборки, которое определяет необходимые ей зависимости. Вы можете сгенерировать переменную OBJECTS
для каждого из них таким же образом, но вам нужно будет перечислить файлы C, которые нужны каждой программе.
SOURCES1 = ag.c other.c something.c
SOURCES2 = sv.c morecode.c something.c
OBJECTS1 = $(foreach o, $(patsubst %.c,%.o,$(SOURCES1)), $(ODIR)/$o)
OBJECTS2 = $(foreach o, $(patsubst %.c,%.o,$(SOURCES2)), $(ODIR)/$o)
$(ODIR)/%.o : %.c $(DEPS)
$(CC) -c -o $@ $<
program1: $(OBJECTS1)
$(CC) $^ -o $@
program2: $(OBJECTS2)
$(CC) $^ -o $@
Для справки $^
означает все зависимости.