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

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

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

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

Интересно, я не знал, что 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, пожалуйста. Я умоляю тебя! 🙂

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

 CC = GCC 
 CFLAGS = -Wall

 все: программа
 program: program.o
 program.o: program.c program.h headers.h

 чистить:
     rm -f program program.o
 запустить: программу
     ./program

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

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

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

достаточно. остальное – неявное

Самый простой файл make может быть

 all : test test : test.o gcc -o test test.o test.o : test.c gcc -c test.c clean : rm test *.o 

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

 gcc program.c -o program 

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

  • В чем разница между назначениями переменных GNU Makefile =,? =,: = И + =?
  • Как использовать LDFLAGS в make-файле
  • Как определить несколько include path в Makefile
  • crti.o отсутствует файл
  • Makefile для размещения объектных файлов из исходных файлов разных каталогов в один отдельный каталог?
  • Могу ли я скомпилировать все .cpp-файлы в src / to .o в obj /, затем ссылку на двоичный файл ./?
  • Общее правило из makefile в CMake
  • Использование G ++ для компиляции нескольких файлов .cpp и .h
  • C ++ Qt - Как добавить «-std = c ++ 11» в make-файл, который генерируется qmake?
  • Что означает @: (в символе двоеточие) в Makefile?
  • Общий путь каталога файлов GNU
  • Давайте будем гением компьютера.