Вот как можно написать правило make, чтобы скомпилировать все файлы .c в файлы .o:
```makefile
# Получить список всех исходных файлов .c в текущей директории
SOURCES := $(wildcard *.c)
# Заменить расширение .c на .o в имени каждого исходного файла
OBJECTS := $(patsubst %.c, %.o, $(SOURCES))
# Правило для компиляции каждого .c файла в соответствующий .o файл
%.o: %.c
gcc -c $< -o $@
# Правило для сборки всех .o файлов в исполняемый файл (название по умолчанию: main)
main: $(OBJECTS)
gcc $^ -o $@
.PHONY: clean
clean:
rm -f $(OBJECTS) main
```
Чтобы компилировать все исходные файлы в соответствующие выходные файлы, используйте следующие строки:
```makefile
# Получить список всех исходных файлов .c и соответствующих выходных файлов .o
SOURCES := $(wildcard *.c)
OBJECTS := $(patsubst %.c, %.o, $(SOURCES))
# Правило для компиляции каждого .c файла в соответствующий .o файл
$(OBJECTS): $(SOURCES)
gcc -c $< -o $@
```
В этом случае каждый .c файл будет компилироваться в соответствующий .o файл. Однако это правило не будет учитывать зависимости между исходными файлами и их выходными файлами, поэтому при изменении одного исходного файла все остальные файлы будут перекомпилированы. Для более эффективной компиляции и использования зависимостей можно использовать инструменты автоматической генерации правил, такие как Makefile Generator.