2013-11-20 4 views
0

Я пытаюсь сделать простой make-файл, чтобы скомпилировать пример приложения, которое я разрабатываю в linux (просто чтобы узнать несколько вещей), но у меня возникает странная проблема, что я не понимаю, почему это происходит ..Ошибка в файле makefile .o

у меня есть этот Makefile:

# Easily adaptable makefile for Advanced Programming 

# Compiler flags 
CFLAGS=-Wall -W -g -Wmissing-prototypes 

# Indentation flags 
IFLAGS=-br -brs -npsl -ce -cli4 

# Name of the executable 
PROGRAM=ex2 
# Prefix for the gengetopt file (if gengetopt is used) 
PROGRAM_OPT=config 
# Object files required to build the executable 
PROGRAM_OBJS=debug.o ${PROGRAM_OPT}.o 

# Clean and all are not files 
.PHONY: clean all docs indent 

all: ${PROGRAM} 

# compile with debug 
debugon: CFLAGS += -D SHOW_DEBUG -g 
debugon: ${PROGRAM} 

${PROGRAM}: ${PROGRAM_OBJS} 
    ${CC} -o [email protected] ${PROGRAM_OBJS} 

# Generates command line arguments code from gengetopt configuration file 
${PROGRAM_OPT}.h: ${PROGRAM_OPT}.ggo 
    gengetopt < ${PROGRAM_OPT}.ggo --file-name=${PROGRAM_OPT} 

# Dependencies 
${PROGRAM_OPT}.o: ${PROGRAM_OPT}.c ${PROGRAM_OPT}.h 
debug.o: debug.c debug.h 
main.o: debug.h ${PROGRAM_OPT}.h 

#how to create an object file (.o) from C file (.c) 
.c.o: 
    ${CC} ${CFLAGS} -c $< 

clean: 
    rm -f *.o core.* *~ ${PROGRAM} *.bak ${PROGRAM_OPT}.h ${PROGRAM_OPT}.c 

indent: 
    indent ${IFLAGS} *.c *.h 

После того, как я печатаю сделать, я получаю сообщение об ошибке говорит мне, что:

make: *** No rule to make target `config.c', needed by `config.o'. Stop. 

я, возможно, отсутствует что-то, но если я нет т ошибаетесь, линия явно там под PROGRAM_OPT

Вот список файлов в каталоге:

  • config.ggo
  • main.c
  • debug.h
  • debug.c
  • Makefile
+1

Какой файл (ы) создает 'getgetopt'? Прямо сейчас знаю только, что он генерирует 'config.h', поэтому, когда вы его запрашиваете (через' $ {PROGRAM_OPT} .o: $ {PROGRAM_OPT} .c $ {PROGRAM_OPT} .h'), чтобы сгенерировать 'config.c' it не знает, как это сделать. –

+0

@EtanReisner, как я уже сказал, у меня создалось впечатление, что make-файл выполнит команду gengetopt, которая по умолчанию генерирует .c и .h-файл –

+0

. Он будет генерировать его. Но он не знает, что он сделал это (и более того), он не знает, что он должен запустить эту команду для создания этого файла в первую очередь. make не проверяет вывод правила, чтобы выяснить, какие файлы генерирует правило (и даже если это не помогло бы с первым запуском). –

ответ

1

Это говорит о том, что make с an't найти исходный файл config.c. У вас есть правило делать config.h, но я не вижу, чтобы он делал config.c.

+0

Действительно, это было проблемой .. Я был под создается впечатление, что после того, как makefile попал в строку «gengetopt <$ {PROGRAM_OPT} .ggo --file-name = $ {PROGRAM_OPT}", он будет делать то, что обычно выполняет с командной строкой, то есть генерирует .c и файл .h, основанный на ggo. Как я пришел, я должен явно указать makefile для генерации .c вместо того, чтобы просто сказать ему, чтобы запустить эту команду? –

+0

Я думаю, что он не генерирует config.c. – Joshua

0

Я уверен, что $ {PROGRAM_OPT} .c не следует ссылаться.

+0

Я думаю, что вы, вероятно, на правильном пути, хотя я думаю, что вы можете иметь это назад, но объясняя, что вы имеете в виду более подробно, это хорошая идея. –

+0

@ EtanReisner, вы хотите развивать этот вопрос немного дальше? Я действительно хотел бы узнать больше –

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