문제

안에 최근 문제, DJGPP는 DOS 명령 줄 문자 제한 만 수락 할 수 있음을 발견했습니다. 이 한계를 해결하기 위해 나는 내가 더 긴 줄을 통과하십시오. Makefile을 해킹하고 테스트하는 과정에서 이상한 오류가 발생했습니다. makefile은 다음과 같습니다.

AS  :=  nasm
CC  :=  gcc
LD  :=  ld

TARGET      :=  $(shell basename $(CURDIR))
BUILD       :=  build
SOURCES     :=  source

CFLAGS  :=  -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
            -nostdinc -fno-builtin -I./include
ASFLAGS :=  -f aout

export OUTPUT   :=  $(CURDIR)/$(TARGET)

CFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))

SOBJS   :=  $(SFILES:.s=.o)
COBJS   :=  $(CFILES:.c=.o)
OBJS    :=  $(SOBJS) $(COBJS)

build   :   $(TARGET).img

$(TARGET).img   :   $(TARGET).bin
    concat.py

$(TARGET).bin   :   $(OBJS)
    $(LD) -T link.ld -o $@ $^

$(SOBJS)    :   %.o :   %.asm
    $(AS) $(ASFLAGS) $< -o $@

$(COBJS)    :   %.o :   %.c
    $(CC) -c $< $(CFLAGS) -o $@

실행하려고 할 때이 오류를받습니다.

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

내가 이해하지 못하는 것은 .C 파일에 대한 규칙을 찾으려고하는 이유입니다. 내가 이해 한 바에 따르면 파일이 있으면 파일을 사용해야합니다. .C 파일에 대한 규칙이 필요하지 않도록하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

당신이하려는 것은 vpath 없이는 작동하지 않을 것이며, 여전히 Makefiles를 배우고 있기 때문에 vpath를 사용하지 않을 것입니다.

규칙은 "consoleio.c"를 찾고 있는데, 내가 당신의 makefile을 올바르게 이해하지 못한다면 존재하지 않는다. 존재하는 것은 "Source/Consoleio.c"입니다. 아마도 "%c"대신 "$ (소스)/%. c"와 같은 것으로 변경해야합니다.

그러나 나는 당신의 구문을 그 규칙에 대해 확인하지 않았습니다. 잘못된 경우, 내장 된 " %.o : %.c"규칙이 대신 사용되며 동일한 문제가 발생합니다.

그러나 당신이하는 방식은 내가 본 일반적인 방법이 아닙니다. 일반적인 방법은 다음과 같습니다.

  • 암시 적 규칙 "%.O :%.c"(또는 귀하의 경우 "%.O : $ (소스)/%. C"를 만듭니다.
  • 명시 적 목록 각 파일의 종속성을 나열합니다. "foo.o : foo.c bar.h baz.h"(명령이 없으면 암시 적 규칙에 명령이 있습니다).

다른 팁

비 코멘트 답변을 시도해 봅시다 ...

가능성 A :

  • Sfiles의 매크로가 ''로 끝나는 파일을 찾고 있습니다..s'.
  • SOBJS 컴파일에 대한 귀하의 규칙은 '로 끝나는 파일을 찾고 있습니다..asm'.

가능성 B :

  • SOBJS와 COBJ에 대한 귀하의 규칙은 내가 인식하지 못하는 표기법에 있습니다.
  • GNU Make Manual에 따르면 암시 적 규칙을 다음과 같이 쓸 수 있습니다.

    %.O : %.c; 명령

당신은 '에 의존하는 대상 $ (sobjs) 목록이있는 것 같습니다.%.o : %.asm'. 내가 어떻게 해석 될지 잘 모르겠습니다.

개인적으로, 나는 빌드 규칙에서 와일드 카드를 믿지 않을 것입니다. 코드를 빌드하는 데 필요한 소스 파일을 정확하게 나열하는 데 시간을 많이 소비하고 싶습니다. 나는 종종이 문제에 빠지지 않습니다.

@cesarb는이 문제를 해결 한 것 같습니다. 몇 가지 관찰을 추가하겠습니다.

  1. 빌드 규칙에 와일드 카드를 사용하는 것을 강력히 추천합니다. 빌드 규칙은 구축중인 내용을 정확하게 정의해야하며 디렉토리에서 어떤 파일이 발생하는지에 따라 달라야합니다.

  2. (1) 별도의 빌드 디렉토리에 건축하거나 (2) 소스 파일이 많은 디렉토리에 퍼져 있지 않는 한 vpath를 사용하는 것이 좋습니다. 모든 소스가 단일 디렉토리에있는 경우 vpath를 사용하면 혼동됩니다.

  3. : = 할당 양식은 일반적으로 변수 평가가 $ (쉘 ...)를 사용할 때와 같이 오랜 시간이 걸리는 것으로 알려진 경우에만 사용됩니다. 그렇지 않으면 "="가 선호됩니다.

  4. "내보내기"를 사용하여 아웃 디어를 concat.py로 전파합니다 (concat.py가 매개 변수를 가져 가지 않기 때문에 그것이 추정한다고 가정합니다)는 코드 냄새입니다. 가능하면 대신 매개 변수로 전달하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top