Как сделать простой make файл для gcc в Linux?

У меня есть три файла: program.c, program.h и headers.h.

program.c включает program.h и headers.h.

Мне нужно скомпилировать это на Linux с помощью gcc-компилятора. Я не уверен, как это сделать. Netbeans создал один для меня, но он пуст.

Ответ 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, пожалуйста. Я умоляю тебя!:)

Ответ 2

Например, этот простой Makefile должен быть достаточным:

CC=gcc 
CFLAGS=-Wall

all: program
program: program.o
program.o: program.c program.h headers.h

clean:
    rm -f program program.o
run: program
    ./program

Обратите внимание, что после очистки и запуска не должно быть <tab> на следующей строке, а не пробелов.

ОБНОВЛЕНИЕ Комментарии ниже применяются

Ответ 3

all: program
program.o: program.h headers.h

. остальные неявные

Ответ 4

Простейшим файлом make может быть

all : test

test : test.o
        gcc -o test test.o 

test.o : test.c
        gcc -c test.c

clean :
        rm test *.o

Ответ 5

В зависимости от количества заголовков и привычек разработки, вы можете изучить gccmakedep. Эта программа проверяет ваш текущий каталог и добавляет в конец make файла зависимости заголовка для каждого файла .c/cpp. Это слишком много, если у вас есть 2 заголовка и один файл программы. Однако, если у вас есть 5+ небольших тестовых программ, и вы редактируете один из 10 заголовков, вы можете доверять make, чтобы восстановить именно те программы, которые были изменены вашими изменениями.

Ответ 6

gcc program.c -o program

не требуется makefile.