#c
Вопрос:
Я новичок в программировании на c, и у меня возникли проблемы с созданием файла Makefile для него.
Мне действительно понравилось
CC = gcc CFLAGS = -fsanitize=address -g -Wall -Wvla OUTPUT = prac all: $(OUTPUT) mymalloc.o: mymalloc.c mymalloc.h $(CC) $(CFLAGS) -c $@ mymalloc.c %: %.c $(CC) $(CFLAGS) -o $@ mymalloc.o $^
и я пытаюсь создать файл, просто набрав «создать».
Но в нем все время говорится
gcc -fsanitize=address -g -Wall -Wvla -o prac mymalloc.o prac.c clang: error: no such file or directory: 'mymalloc.o' make: *** [prac] Error 1
всякий раз , когда я пытаюсь это сделать, я делаю что-то не так?
Спасибо.
Править)
Я все сделал правильно, используя это!
CC = gcc CFLAGS = -fsanitize=address -g -Wall -Wvla DEPS = mymalloc.h OBJS = prac.o mymalloc.o %.o: %.c $(DEPS) $(CC) $(CFLAGS) -c -o $@ $lt; prac: $(OBJS) $(CC) $(CFLAGS) -o $@ $^
Комментарии:
1. Вам также нужна такая зависимость, как:
$(OUTPUT): mymalloc.o prac.o
2. @Barmar Тогда, должен ли я создать еще один файл.o и добавить его, чтобы сделать исполняемый файл?
3. Проблема в том , что
%: %.c
правило запускается дляprac
, но это правило используетсяmymalloc.o
без зависимости дляmymalloc.o
. Может быть, прочтите руководство по изготовлению о «сделать зависимым». Или сначала замените правила четкими инструкциями. Может быть, оптимизируем позже.
Ответ №1:
Вам нужно сделать исполняемый файл зависимым от mymalloc.o
:
%: %.c mymalloc.o $(CC) $(CFLAGS) -o $@ mymalloc.o $^
Зависимость указывает make
, что ей необходимо выполнить правило для создания mymalloc.o
.
Кроме того, ваше правило для создания mymalloc.o
неверно. Вам нужно -o
до $@
:
mymalloc.o: mymalloc.c mymalloc.h $(CC) $(CFLAGS) -c -o $@ mymalloc.c
В противном случае он пытается использовать выходной файл в качестве одного из входных файлов.
Комментарии:
1. Я изменил его на такой, но все равно получил ту же ошибку..
2. Может быть, проверить вывод
make -d ...
.3. @RyanLee обновил ответ.
4. Спасибо! Я сделал не совсем то, что вы говорите, но я получил большие знания о правиле зависимости от makefile!