Ответ 1
Интересно, что я не знал, что make по умолчанию будет использовать компилятор 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
(имейте в виду, что make требует вкладки вместо отступа пространства, поэтому не забудьте зафиксировать это при копировании)
Однако, чтобы поддерживать больше файлов C, вам нужно будет создать новые правила для каждого из них. Таким образом, чтобы улучшить:
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o [email protected]
program: $(OBJECTS)
gcc $(OBJECTS) -o [email protected]
clean:
-rm -f $(OBJECTS)
-rm -f program
Я попытался сделать это максимально простым, опуская переменные, такие как $(CC) и $(CFLAGS), которые обычно видны в make файлах. Если вы заинтересованы в том, чтобы понять это, я надеюсь, что я дал вам хорошее начало.
Здесь 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 [email protected]
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o [email protected]
clean:
-rm -f *.o
-rm -f $(TARGET)
Он использует функции wildcard и patsubst утилиты make для автоматического включения файлов .c и .h в текущий каталог, что означает, что когда вы добавляете новые файлы кода в свой каталог, вам не нужно обновлять Makefile. Однако, если вы хотите изменить имя сгенерированного исполняемого файла, библиотек или флагов компилятора, вы можете просто изменить переменные.
В любом случае, не используйте autoconf, пожалуйста. Я умоляю тебя!:)