У меня есть три файла: program.c
, program.h
и headers.h
.
program.c
включает program.h
и headers.h
.
Мне нужно скомпилировать это на Linux с помощью gcc-компилятора. Я не уверен, как это сделать. Netbeans создал один для меня, но он пуст.
У меня есть три файла: program.c
, program.h
и headers.h
.
program.c
включает program.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 all: program program: program.o program.o: program.c program.h headers.h clean: rm -f program program.o run: program ./program
Обратите внимание, что после очистки и запуска не должно быть <tab>
на следующей строке, а не пробелов.
ОБНОВЛЕНИЕ Комментарии ниже применяются
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.