2012-07-05 2 views
0

make manual에서 Automatic Dependency Generation을 통해 읽었으며이 기능이 필요한 이유를 알 수 없습니다. 이 프로젝트를 내가 일하고 및 I는 다음과 같이 구성되어 처음부터 쓰기 시작한다 :이은 각 .cpp 파일이 동일한 단일 .H 파일을 포함해야 자신의 폴더 자동 종속성 생성

    • 각 단위 (라이브러리) 동일한 디렉토리의 이름. 이 규칙은 원형 의존성의 경우와 같이 너무 제한적일 수 있습니다.이 경우 다음 규칙에 설명 된 것과 같이 다른 .h 파일을 포함 할 수 있습니다.
    • .h 파일에 다른 헤더를 포함하는 경우, 종속성이 다른 유닛 (라이브러리)에있는 경우 항상 프로젝트의 루트 디렉토리에 상대적인 경로를 사용하십시오. 그렇지 않으면 파일 이름 만 포함 시키십시오.

    makefile에서 나는 -I .을 컴파일러에 전달합니다. 디렉터리 X에서 .cpp 파일을 발견하면 동일한 디렉터리 (또는 . 디렉터리)에서 .h 파일을 검색합니다. .h 파일을 구문 분석 할 때 . 폴더에 대한 포함이 발생하므로 파일을 찾을 위치를 알 수 있습니다.

    이제 누구도 -M 플래그가있는 종속성 목록을 생성하고 위에 설명 된 것처럼 코드를 구조화 할 수 있다면 불분명 한 .d 파일 (종속성 fie)을 생성하기 위해 sed를 사용하지 않는 이유는 무엇입니까? 코드 파일에서 특정 종속성 목록을 생성 할 시점이 없습니다.

  • 답변

    4

    실제로 각 소스 파일은 여러 헤더 파일에 의존하기 때문에. 해당 헤더가 변경 될 때마다 소스 파일을 다시 컴파일하지 않으면 일관성이없는 바이너리로 끝날 가능성이 높습니다.

    +0

    아, 맞다 ... 나는 이해합니다. 그러나 .cpp 파일을 컴파일하기 전에 전체 종속성 트리에서 변경 사항을 확인하지는 않습니까? –

    +1

    @MihaiTodor : Make는 의존성이 무엇인지 파악하지 못합니다. 모든 make가 할 수있는 일은 의존성의 변화를 기반으로 규칙을 재실행해야 하는지를 파악하는 것입니다. 각 대상에 대한 종속성 목록을 제공해야합니다. –

    +0

    당신 말이 맞아요. 지금은 이해. 고마워요! –

    1

    그게 바로 makepp의 작동 방식입니다. 종속성은 자동으로 탐지됩니다. 귀하의 경우에는 makefile이 필요하지 않습니다 (명령에서 대상 지정이 마음에 들지 않는 경우).

    내장 된 링커 규칙은 자동으로 개체 파일을 추론합니다. makepp proggie이라고하면, include 문에 대해 proggie.c (또는 .cpp 또는 사용자가 가지고있는 것)를 스캔합니다. 각 문에 대해 일치하는 .o 파일이 있는지 확인하고, 일치하는 경우 재귀 적으로 검사합니다. 이 방법으로 발견 된 모든 .o 파일은 빌드되고 함께 연결됩니다.

    아니면 메이크 대상마다 시간을 지정 피하기 위해 하나 라이너 수 :

    $(phony all): proggie 
    
    +0

    제안 해 주셔서 감사합니다.하지만, 잠시 동안, 나는 고집 할 것입니다. –