2011-05-04 4 views
21

나는 이미 Doxygen + Graphviz를 적용한 중간 크기의 C/C++ 프로젝트에서 작업합니다. 헤더 그래프는 유용하지만 #include에 기반한 관계 만 보여줍니다. 나는 #include뿐만 아니라 실제 심볼 사용법을 기반으로 파일 종속성을 분석하는 (선호하는 리눅스 기반의) 툴을 찾는 것에 관심이있다. 예를 들어, 이러한 도구는 을 포함하는 a.cpp을 나타내지 만 a.cppb.h에 포함 된 c.h에 선언 된 SomeClass을 사용합니다. 그것은 또한 정리 될 수있는 헤더 포함을 제안 할 수 있습니다."딥"헤더 종속성 분석

답변

18

나는 꽤 좋은 결과를 가지고 Include What You Use을 사용했습니다. Clang을 사용하여 C++ 코드를 구문 분석하고 제거 할 헤더 파일을 추가하고 전달할 것을 제안합니다.

하나의 단점은 코드 레이아웃 (기본적으로 Google 코딩 표준)을 가정한다는 것입니다. 따라서 SomeClass.cpp이라는 파일이있는 경우에만 SomeFile.h이 표시됩니다. 또한 프로젝트의 루트에서 전체 경로를 사용하는 것이 좋습니다 (#include "SomeClass.h" 대신 #include "src/SomeClass.h"). 결국 모호성을 피하면서 어쨌든이 규약으로 코드를 변경했으나 시도 할 때 머리가 필요합니다.

보통 CC=include-what-you-use을 설정하고 결과를 얻으려면 다시 빌드하십시오. - 모든 clang 기계를 사용하여 -I 인수를 구문 분석합니다. 결과를 사용하여 #include 행을 자동으로 업데이트하는 python 프로그램이 있습니다.

편집 : 정교가 아니라 설정하는 간단하고 제거하는 #include의를 제안 할 수 있습니다

또 다른 도구는 deheader입니다. 이것은 C++ 파일을 임시 위치에 복사하고 #include을 제거하고 다시 컴파일하여 작동합니다. 다시 컴파일하면 헤더 파일을 안전하게 제거 할 수 있습니다. 그것은 앞으로 선언문이나 멋진 것을 제안하는 것이지, 구현 파일에 불필요한 줄을 포함시킬 수 있습니다.

+0

유망한 것으로 보이지만 설치할 바이너리가 없다는 것은 정말 고통 스럽습니다. 그리고 llvm을 컴파일하기 시작했을 때, 하드 드라이브가 용량을 가득 채웠습니다. – Reinderien

+0

@Reinderien llvm + clang의 체크 아웃 및 빌드는 1Gb 주변의 "유일한"것이므로 configure 스크립트에 --enable-optimized를 전달해야합니다. 디버그 빌드를 사용하면 4Gb를 다시 설정할 수 있습니다. – richq

+0

저는 마침내 IWYU를 구축 할 수있었습니다. 예, 부피가 크고, 부 풀리는 등의 문제가있었습니다 만, 아무것도없는 것보다 낫습니다. 나는 deheader도 살펴볼 것이다. 감사 – Reinderien