2013-11-20 2 views
0

나는 간단한 makefile을 만들어서 (내가 몇 가지를 배우기 위해) 리눅스에서 개발하고있는 샘플 애플리케이션을 컴파일하려고하는데, 이상한 문제가있다. 이 일이 왜 표시되지 않습니다 ..Makefile .o 파일 규칙 문제

을 나는이 메이크 파일이 있습니다

# 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. 

을 내가 누락 될 수 있습니다 뭔가.하지만 내가 아냐. 잘못된 T, 선은 여기

는 디렉토리에있는 파일 목록 PROGRAM_OPT

에서 명시 적으로있을 수 있습니다 :

  • config.ggo
  • main.c를
  • 은 Debug.h
  • debug.c는
  • 메이크 파일
+1

'getgetopt' 파일은 어떤 파일을 생성합니까? 현재 make는 단지'config.h'를 생성한다는 것을 알기 때문에 ('$ {PROGRAM_OPT} .o : $ {PROGRAM_OPT} .c $ {PROGRAM_OPT} .h'를 통해)'config.c'를 생성하도록 요청하면 그것을하는 방법을 모른다. –

+0

@EtanReisner 필자는 makefile이 gengetopt 명령을 실행한다는 인상하에있었습니다. 기본적으로 .c 및 .h 파일을 생성합니다. –

+0

생성 할 것입니다. 그러나 처음에는 파일을 생성하기 위해 명령을 실행해야한다는 것을 몰랐습니다. make는 룰이 어떤 파일을 생성하는지 알아 내기 위해 룰 출력을 검사하지 않는다. (심지어 첫 번째 실행에 도움이되지 않는다고해도). –

답변

1

이것은 make c 소스 파일 config.c을 찾으십시오. config.h을 만드는 규칙이 있지만 config.c을 만들 수는 없습니다.

+0

실제로 문제가있는 것처럼 보입니다. 일단 makefile이 "gengetopt <$ {PROGRAM_OPT} .ggo --file-name = $ {PROGRAM_OPT}"줄에 도착했다면 커맨드 라인이 일반적으로하는 일을 할 것인데, 즉 .c와 .h 파일, ggo 기반 ... 어떻게 명시 적으로 명령을 실행하는 대신 .c 생성하기 위해 메이크 파일을 말해야할까요? –

+0

config.c가 생성되지 않는다고 생각합니다. – Joshua

0

$ {PROGRAM_OPT} .c를 참조하면 안됩니다.

+0

나는 당신이 아마 당신이 올바른 길을 가고 있다고 생각하지만, 당신이 이것을 거꾸로 가질 수도 있다고 생각하지만, 당신이 더 상세하게 의미하는 것이 좋은 아이디어라고 설명합니다. –

+0

@EtanReisner, 그 문제를 조금 더 발전시켜야합니까? 나는 더 많이 알고 싶다. –