Как можно написать правило make, чтобы скомпилировать все файлы .c в файлы .o?

Как можно создать правило для компиляции исходных файлов в соответствующие выходные файлы, используя имеющиеся списки исходных файлов и выходных файлов? Моя текущая попытка приводит к тому, что один и тот же исходный файл компилируется во все выходные файлы.
  • 21 декабря 2023 г. 23:37
Ответы на вопрос 2
Вот как можно написать правило 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.
Например, так: 
Похожие вопросы