문제

GCC를 사용하여 종속성 파일을 생성하고 있지만 빌드 규칙에 따라 출력이 하위 디렉터리에 저장됩니다.생성된 종속 파일에 내 하위 디렉터리 접두사를 넣도록 GCC에 지시하는 방법이 있나요?

gcc $(INCLUDES) -E -MM $(CFLAGS) $(SRC) >>$(DEP)
도움이 되었습니까?

해결책

대답은 GCC 매뉴얼:사용 -MT 깃발.

-MT target

종속성 생성으로 생성된 규칙의 대상을 변경합니다.기본적으로 CPP는 기본 입력 파일의 이름을 사용하고 다음과 같은 모든 디렉터리 구성 요소와 파일 접미사를 삭제합니다. .c, 플랫폼의 일반적인 객체 접미사를 추가합니다.결과는 목표입니다.

-MT 옵션은 대상을 정확히 사용자가 지정한 문자열로 설정합니다.여러 대상을 원하는 경우 단일 인수로 지정할 수 있습니다. -MT, 또는 여러 개를 사용 -MT 옵션.

예를 들어, -MT '$(objpfx)foo.o' 줄 수도 있다

$(objpfx)foo.o: foo.c

다른 팁

나는 당신이 GNU Make와 GCC를 사용하고 있다고 가정합니다.먼저 종속성 파일 목록을 보관할 변수를 추가합니다.모든 소스를 나열하는 소스가 이미 있다고 가정합니다.

SRCS = \
        main.c \
        foo.c \
        stuff/bar.c

DEPS = $(SRCS:.c=.d)

그런 다음 생성된 종속성을 makefile에 포함합니다.

include $(DEPS)

그런 다음 다음 패턴 규칙을 추가합니다.

# automatically generate dependency rules

%.d : %.c
        $(CC) $(CCFLAGS) -MF"$@" -MG -MM -MP -MT"$@" -MT"$(<:.c=.o)" "$<"

# -MF  write the generated dependency rule to a file
# -MG  assume missing headers will be generated and don't stop with an error
# -MM  generate dependency rule for prerequisite, skipping system headers
# -MP  add phony target for each header to prevent errors when header is missing
# -MT  add a target to the generated dependency

"$@"은 대상입니다(왼쪽에 있는 것:), "$<"가 전제 조건입니다(의 오른쪽에 있는 것:)."$(<:.c=.o)" 표현식은 .c 확장자를 .o로 대체합니다.

여기서의 비결은 -MT를 두 번 추가하여 두 개의 대상이 있는 규칙을 생성하는 것입니다.이로 인해 .o 파일과 .d 파일이 모두 소스 파일과 해당 헤더에 종속됩니다.이렇게 하면 해당 .c 또는 .h 파일이 변경될 때마다 종속성 파일이 자동으로 다시 생성됩니다.

-MG 및 -MP 옵션은 헤더 파일이 없어도 make가 놀라는 것을 방지합니다.

이 간략한 버전이 마음에 드실 수도 있습니다. 돈 맥커히의 답변:

SRCS = \
    main.c \
    foo.c \
    stuff/bar.c

DEPS = $(SRCS:.c=.d)

추가하다 -include $(DEPS) 참고 - 오류를 침묵시키는 접두사 .d 파일이 아직 존재하지 않습니다.

종속성 파일을 생성하기 위해 별도의 패턴 규칙이 필요하지 않습니다.간단히 추가하세요 -MD 또는 -MMD 일반 컴파일 라인에 .d 소스 파일이 컴파일되는 동시에 파일이 생성됩니다.예를 들어:

%.o: %.c
     gcc $(INCLUDE) -MMD -c $< -o $@

# -MD can be used to generate a dependency output file as a side-effect of the compilation process.

자세히 설명 DGentry의 답변, 이것은 나에게 잘 작동했습니다.

.depend: $(SOURCES)
    $(CC) $(CFLAGS) -MM $(SOURCES) | sed 's|[a-zA-Z0-9_-]*\.o|$(OBJDIR)/&|' > ./.depend

이는 모든 소스 파일에 대한 종속성 규칙을 포함하는 종속성 파일이 하나만 있는 경우에도 작동합니다.

좋습니다. 질문이 올바른지 확인하기 위해 다음을 수행합니다.나는 당신이 가지고 있다고 가정합니다 test.c 이는 다음을 포함합니다 test.h, 그리고 당신은 생성하고 싶습니다 subdir/test.d (하는 동안 ~ 아니다 생성 subdir/test.o) 어디 subdir/test.d 포함

subdir/test.o: test.c test.h

오히려

test.o: test.c test.h

그것이 바로 지금 당신이 얻는 것입니다.그렇죠?

나는 당신이 요구하는 것을 정확하게 수행하는 쉬운 방법을 생각해 내지 못했습니다.그러나 살펴보면 종속성 생성 개선, .d .o 파일을 생성하는 동안 다음을 사용할 수 있습니다.

gcc $(INCLUDES) -MMD $(CFLAGS) $(SRC) -o $(SUBDIR)/$(OBJ)

(주어진 SRC=test.c, SUBDIR=subdir, 그리고 OBJ=test.o.) 이렇게 하면 subdir/test.o와 subdir/test.d가 모두 생성됩니다. subdir/test.d 위와 같이 원하는 출력이 포함되어 있습니다.

이를 수행하기 위해 GCC에 대한 주장이 있다면 그것이 무엇인지 모르겠습니다.결국 종속성 출력을 다음을 통해 파이핑하게 됩니다. sed 모든 항목을 다시 작성하려면 <blah>.o ~처럼 ${OBJDIR}/<blah>.o.

  1. [GNU] make는 출력을 현재 디렉토리에 두지 않으면 화를 냅니다.실제로 빌드 디렉터리에서 make를 실행하고 VPATH make 변수를 사용하여 소스 코드를 찾아야 합니다.컴파일러에게 거짓말을 하면 조만간 복수를 하게 될 것입니다.

  2. 다른 디렉터리에서 개체와 종속성을 생성해야 한다면 다음을 사용해야 합니다. -o 인수, 다음과 같이 에밀이 대답했다.

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