Компоновщик говорит вам, что у вас есть больше определений X , чем вы должны, и у вас должно быть только одно. В таком сценарии ios вы должны отследить, где могут быть определены эти дополнительные определения. В этом простом проекте это довольно просто, посмотрите на команды, которые вы используете для компиляции и связывания:
output: $(obj)
$(CC) $^ -o $@ $(LDFLAGS)
$(obj): $(SRC)
$(CC) $^ -o $@ $(LDFLAGS)
В g cc вы можете go двумя способами:
- скомпилируйте за один шаг и скомпонуйте на другом шаге (это то, что вам нужно),
- скомпилируйте и скомпонуйте за один шаг (это то, что вы на самом деле сделали).
Вы скомпилировали и связали один и тот же шаг два раза. Первая цель ($(obj): $(SRC)
) компилировала и связывала ваш исполняемый файл, а затем вторая цель пыталась связать что-то, что уже связано.
Теперь вы можете либо удалить ненужную цель связывания, либо указать g cc в цели компиляции, для которой вы хотите скомпилировать только файлы, потому что вы свяжете их позже (-c
флаг).
Отдельная компиляция и компоновка
CC = gcc
SRC = $(wildcard src/*.c) $(wildcard src/utils/*.c)
obj = $(SRC:.c=.o)
LDFLAGS =
output: $(obj)
$(CC) $^ -o $@ $(LDFLAGS)
$(obj): $(SRC)
$(CC) -c $^
.PHONY: clean
clean:
rm -f $(obj) main
Компиляция и ссылку сразу
CC = gcc
SRC = $(wildcard src/*.c) $(wildcard src/utils/*.c)
obj = $(SRC:.c=.o)
LDFLAGS =
output: $(SRC)
$(CC) $^ -o $@ $(LDFLAGS)
.PHONY: clean
clean:
rm -f $(obj) main