2015-10-23 4 views
-2

Я пытаюсь использовать этот Makefile для C-программы. Не могли бы вы поделиться со мной способом, как я могу лучше понять, как сделать утилиту? Я пытаюсь следующее:Makefile для программы C

# stack/Makefile 
CC := gcc 
CFLAGS += -std=c99 
CFLAGS += -Wall 
CFLAGS += -Wextra 
CFLAGS += -g 
VPATH = main src 

all: bin/main.exe clean run 
bin/main.exe: bin/main.o bin/stack.o 
    $(CC) -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 
bin/main.o: main.c 
bin/stack.o: stack.c stack.h 
bin/%.o: %.c 
    $(CC) $(CFLAGS) -c -o [email protected] $< 
demo:  
    ../bin/main.exe 
clean: 
    rm -f bin/*.o 
run: 
    bin/main.exe 
.PHONY: all clean run 

И я получаю это сообщение:

gcc -std=c99 -Wall -Wextra -g -c -o bin/main.o main.c 
error: unable to open output file 'bin/main.o': 'No such file or directory' 
1 error generated. 
make: *** [bin/main.o] Error 1 
+2

У вас есть подкаталог 'bin'? Если нет, создайте его и повторите команду 'make'. –

+0

Да, данный подкатегория: 'ls bin main src test' – ishango

+0

Держать; если исходный файл 'main.c' находится в' src', но компилятор находит его как 'main.c', тогда файл объекта должен перейти в' ../ bin/main.o', а не 'bin/main .o'. У вас есть папка 'bin' на верхнем уровне, но ваши команды запускаются на один уровень, поэтому вам нужно идти вверх (' ..'), прежде чем перейти в каталог 'bin'. Это проблема? –

ответ

-1

Лучший способ научиться правильно использовать мейкфайлы, чтобы прочитать manual. Кроме того, вы можете использовать Google для некоторых simple tutorials.

+0

Если у вас нет конкретного учебника, я не думаю, что «google it» - очень хороший ответ. – DeepDeadpool

+0

RTFM - это ответ, поисковая система - это просто дополнительный бонусный комментарий. – JonS

2

Ошибка связана с тем, что ваш Makefile хочет генерировать исполняемый файл и файлы в подкаталоге bin объекта, но не содержит правила, чтобы гарантировать, что bin существует тогда, когда это необходимо . Как @JonathanLeffler комментирует, вы можете решить это , просто создав вручную bin.

Но часто желательно, чтобы сам Makefile обеспечит что подкаталог, или какой-либо другой ресурс, существует тогда, когда он нужен, и вы, вероятно, предполагается, что модель властвуй

bin/%.o: %.c 

бы создать bin при необходимости. Это не так.

Ваш Makefile может обеспечить существование bin если вы изменить его следующим образом:

Где-то ниже all правило, добавить новую цель:

bin: 
    mkdir -p [email protected] 

Это сделать подкаталог bin если его не существует.

Затем измените правило:

bin/%.o: %.c 
    $(CC) $(CFLAGS) -c -o [email protected] $< 

к:

bin/%.o: %.c | bin 
    $(CC) $(CFLAGS) -c -o [email protected] $< 

Дополнительный | bin является примером order-only prequisite Это означает: Если какой-либо из целей (в bin/%.o вещей) необходимо быть переделанным из любого из предшествующих предварительных требований (до |, то есть %.c вещей), то bin должно быть сделано первый. Итак, как только что-то должно быть сделано в bin, сначала будет сделано bin.

В вашем Makefile есть еще один основной недостаток. all зависит от clean, поэтому каждый раз, когда вы успешно создаете , ваша программа удаляет объектные файлы. Я понимаю, что вы намерены, но это совершенно поражений цели make, которая является избежать необходимости восстановить все (объектные файлы, исполняемые) каждый времени, а не просто восстановление тех вещей, которые стали для улицы с учетом их предварительных условий.

all Так не должно зависеть от clean, а затем объектный файл будет перекомпилировать только тогда, когда он нуждается в к перекомпилировать, т.е. старше соответствующего исходного файла. Если и когда вы хотите очистить объектные файлы , запустите make clean.

Наконец, ваше demo правило:

demo:  
    ../bin/main.exe 

несовместима с другими. Остальные предполагают, что bin, где находится исполняемый файл , находится в текущем каталоге. Правило demo предполагает, что он находится в родительском текущей директории. Если вы исправите правило demo, оно будет идентично правилу run, поэтому оно является излишним, но если оно не было лишним, то оно должно быть добавлено к .PHONY целям.

Смежные вопросы