2012-08-24 2 views
4

빌드 시스템을 보면서 많은 SCons, Bjam, cmake, Tundra 등은 #include 스캐너를 내장하고 있습니다. 그러나 gcc & icc는 C++ 파일이 의존하는 헤더 파일의 이름을 출력하는 -MMD (또는 -MD) 옵션을 제공합니다."g ++ -MMD"가 검사를 포함하는 것보다 낫습니까?

-MMD 의존 옵션은 신뢰할 수있는 것 같습니다. #include을 C 파일에 추가하면 빌드 시스템이이를 다시 컴파일 할 수 있도록 해당 타임 스탬프가 변경됩니다. #include을 헤더 파일에 추가하면 해당 타임 스탬프가 변경되어 영향을받는 모든 C 파일을 다시 컴파일합니다.

스캔 시스템이 포함되어 있지만, -MMD은 내게 강건 해 보입니다. 어떤 것이 가장 좋은 이유는 무엇입니까?

답변

4

-MMD은 귀하가주는 이상적인 것입니다.

일반 컴파일 프로세스의 일부로 컴파일러에서 출력 종속성을 가져 오면 컴파일 및 종속성을 찾을 때 -I 경로 및 매크로와 같은 컴파일러 옵션 집합이 적용됩니다. 두 개의 개별 도구에 대해 동일한 옵션을 사용하는 것보다 덜 복잡하고 오류가 발생하기 쉽지 않습니다.

+0

감사합니다. 왜 모든 도구에 # 스캔 기능이 포함되어 있는지 알 수 있습니까? – ACyclic

+1

모두가 gcc (또는 icc)를 사용하지 않으며 gcc의 IIRC 이전 버전은 전체 경로명이 아닌'-MD'의 출력에만 파일 이름을 포함합니다. 'dir1/dir2/foo.o' 대신'foo.o :' –

+1

MMD의 작은 사안은리스트를 포함합니다 : # 을 #include하면 -I include dirs를 모두 보입니다. 두 개의 foo.h 파일이 있으면 첫 번째 파일을 읽습니다. 따라서 검색 목록의 앞부분에 -I includedir과 동일한 이름의 새 헤더 파일을 추가하면 -MMD에 의존하게됩니다. – ACyclic