Цікаво, що я не знав, що за замовчуванням використовувати компілятор C, заданий правила щодо вихідних файлів.
У будь-якому випадку, простим рішенням, яке демонструє прості концепції Makefile, було б:
HEADERS = program.h headers.h
default: program
program.o: program.c $(HEADERS)
gcc -c program.c -o program.o
program: program.o
gcc program.o -o program
clean:
-rm -f program.o
-rm -f program
(майте на увазі, що для створення потрібна вкладка замість відступу, тому обов'язково виправте це під час копіювання)
Однак, щоб підтримувати більше файлів C, вам доведеться створити нові правила для кожного з них. Таким чином, вдосконалити:
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
clean:
-rm -f $(OBJECTS)
-rm -f program
Я намагався зробити це максимально простим, опустивши такі змінні, як $ (CC) і $ (CFLAGS), які зазвичай бачать у makefiles. Якщо вам цікаво розібратися в цьому, я сподіваюся, що я добре почав з цього питання.
Ось Makefile, який я люблю використовувати для джерела C. Сміливо користуйтеся ним:
TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall
.PHONY: default all clean
default: $(TARGET)
all: default
OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
Він використовує символи підстановки та patsubst утиліти make для автоматичного включення .c та .h файлів у поточний каталог, тобто коли ви додаєте нові файли коду до свого каталогу, вам не доведеться оновлювати Makefile. Однак якщо ви хочете змінити ім'я створених виконуваних файлів, бібліотек або прапорців компілятора, ви можете просто змінити змінні.
В будь-якому випадку не використовуйте autoconf, будь ласка. Я тебе благаю! :)