У меня есть три файла: 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 $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
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 $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
Он использует подстановочные знаки и функции patsubst утилиты make для автоматического включения файлов .c и .h в текущий каталог, то есть при добавлении новых файлов кода в каталог вам не придется обновлять Makefile. Однако, если вы хотите изменить имя сгенерированного исполняемого файла, библиотек или флагов компилятора, вы можете просто изменить переменные.
В любом случае, пожалуйста, не используйте autoconf. Я умоляю тебя! :)
.PHONY: clean all default
для тех целей, которые предназначены для использования из командной строки. Кроме того, Autoconf / Automake не так уж и плох. Конечно, они ужасны, и привыкнуть к ним так же весело, как пробить голову через кирпичную стену, но они действительно работают, и они хорошо развиты, и они охватят большинство ваших баз, насколько это возможно. и в конце концов они сделают вашу жизнь намного проще, когда вы привыкнете к их ужасному дизайну.
rm
: stackoverflow.com/questions/2989465/rm-rf-versus-rm-rf
Например, этого простого Makefile должно быть достаточно:
CC = GCC CFLAGS = -Wall все: программа программа: program.o program.o: program.c program.h headers.h чистый: rm -f программа program.o запустить: программа ./program
Обратите внимание, что <tab>
на следующей строке после очистки и запуска должны быть пробелы, а не пробелы.
ОБНОВЛЕНИЕ Комментарии ниже применены
make
без аргументов обычно только строить свое программное обеспечение. Чтобы запустить его, либо используйте make run
(доступно в этом ответе, но не обязательно во всех Makefile
s), либо запустите его напрямую:./program
all: program
program.o: program.h headers.h
достаточно. остальное неявно
.c
файл, program:
необходим только его. Sweet :)
Самый простой 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 перестроить именно те программы, которые были изменены вашими модификациями.