Почему мое правило Makefile не удаляет файлы .o? - PullRequest
1 голос
/ 26 января 2020

Мой Makefile работает, но я все еще получаю файл main.o, созданный при вызове make.
Я просматривал переполнение стека для таких тем, как моя, но не смог понять причина.

Вот содержание Makefile:

EXEC=program
SOURCES=main.c
OBJECTS=$(SOURCES:.c=.o)
CC=gcc -pthread -lpthread
CFLAGS=-std=gnu99 -g

.PHONY: clean

default: $(EXEC)

main.o: main.c
clean:
    -rm *.o $(objects) program

%.o: %.c
    $(CC) -o $@ -c $< $(CFLAGS)

$(EXEC): $(OBJECTS)
    $(CC) -o $@ $^

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Если вы хотите, чтобы ваши объектные файлы были удалены после этапа сборки, просто добавьте команду rm -f *.o к цели $(EXEC).

Кроме того, в комментариях указано несколько примечаний:

  • Имена переменных в Makefile чувствительны к регистру. Используйте objects или OBJECTS, а не оба.

  • Вместо жесткого кодирования program в вашей цели clean, вместо этого следует использовать $(EXEC). Таким образом, вам не придется менять его каждый раз, когда вы меняете имя вашей программы.

  • Обычно вы хотите, чтобы после компиляции оставалось .o файлов, поэтому вам не нужно перекомпилировать все после небольшого изменения.

0 голосов
/ 27 января 2020

Вы можете сделать так, чтобы Make автоматически удалял ваши объектные файлы - и не восстанавливал их без необходимости, если источники не были изменены - путем создания их промежуточных файлов с помощью специальной цели .INTERMEDIATE. Просто добавьте эту строку:

.INTERMEDIATE: $(OBJECTS)
...