#include 종속성을 추적하는 도구 [닫기]


175

좋은 제안이 있습니까? 입력은 헤더 파일의 이름이며 출력은 직접 또는 간접적으로 포함 된 모든 파일의 목록 (바람직하게는 트리)이어야합니다.


4
"favorite"에 관한 것이 아니며 gcc에 잘 포함되어 있지만 msvs는 그렇지 않습니다. 그래서 우리는 (I) 어떤 도구를 찾고 있습니다.
판타지 스토리

70
"주제에 맞지 않는"질문이 계속 도움이되는 이유는 무엇입니까?
jfritz42

5
@ jfritz42 : "올해의 댓글"상을 수상해야합니다! 너무 많은 주제와 많은 사용자가있을 때 한 중재자가 "주제 이외의"질문에 어떻게 레이블을 지정할 수 있습니까?
토토로

2
파이썬으로 작성된 매우 순진한 도구 인 cpp-dependencies , iwyudep-matrix#include같은 종속성 을 처리하기위한 훨씬 더 많은 도구가 있다는 것을 알고 싶었습니다 .
nonsensickle

3
@ jfritz42 정확한 숫자 : 123 표, 62 표. 많은 사람들이 이런 식으로 봅니다. 이상한 SO 표준. 또한 그러한 질문이 슈퍼 유저에게도 같은 훌륭한 답변이 될 것임을 의심합니다.
Andreas

답변:


148

GCC / G ++에 액세스 할 수 있으면 -M옵션 이 종속성 목록을 출력합니다. 다른 도구가하는 추가 작업은 수행하지 않지만 컴파일러에서 제공되므로 "잘못된"위치에서 파일을 가져올 가능성은 없습니다.


60
-H심지어 나무를 준다!
SamB

28
-MM시스템 헤더 생략
TheJosh

3
또한 -o옵션을 사용하면 컴파일러는 stdout 대신 파일에 출력을 씁니다.
Hi-Angel

2
@SamB 오류가없는 경우에만 작동하며 stderr대신에 인쇄됩니다 stdout. 그렇지 않으면이 옵션이 더 일반적입니다.
user877329

92

KeithB에게 감사합니다. cl.exe (VS2008)에 대한 문서를 찾아서 / showIncludes 플래그를 찾았습니다. IDE에서는 CPP 파일의 속성 페이지에서 설정할 수 있습니다.

스크린 샷


1
이것은 매우 어려운 컴파일 오류 / 경고를 해결하는 데 매우 유용합니다. 고마워요!
Ashwin Nanjappa

이것은 또한 매우 최적화 미리 컴파일 된 헤더를 시도 할 때 편리합니다!
fmuecke

VS에서 일할 때 이것이 내 문제를 해결하는 가장 빠른 해결책이라고 생각합니다 ~ :-)
yaobin

일부 헤더에 std c 헤더가 포함되어 있으면 작동하지 않는 것 같습니다.math.h
abergmeier

29

중량 솔루션의 경우 doxygen을 확인해야합니다 . 코드베이스를 스캔하고 효과적으로 코드를 문서화하는 웹 사이트를 제공합니다. 그것이 보여주는 많은 것 중 하나는 나무를 포함한다는 것입니다.

이 도구의 출력을 다른 프로세스에 꽂을 수 있었으면 작동하지 않을 수 있습니다 (doxygen은 다른 형식으로 출력하지만 실제로는 해당 기능에 익숙하지 않습니다). 그러나 의존성을 단순히 눈으로보고 싶다면 훌륭하게 작동해야합니다.


20

cinclude2dot 이라는 도구를 가지고 놀았습니다 . 여기서 일할 때 다소 큰 코드베이스를 처리하는 데 매우 유용했습니다. 나는 실제로 그것을 일일 빌드에 통합하는 것에 대해 생각했습니다.


2
이 도구는 매우 잘 작동합니다. g ++의 -M 및 doxygen에 문제가있었습니다.
sleeparrow

나는 cinclude2dot의 출력을 읽고 맵에서 모든 종속성을 얻은 다음 깊이 우선 순회를 수행하여 소스 포리스트를 출력하는 Python 스크립트를 작성했습니다. .cc/.c/.cxx파일 이없는 포리스트 ( .h파일 만 포함 )는 중복 될 수 있습니다.
shuva

12

먼저 cinclude2dot.pl은 C / C ++ 코드를 분석하고 graphviz에 입력하기위한 도트 파일로 #include 종속성 그래프를 생성하는 perl 스크립트입니다.

http://www.flourish.org/cinclude2dot/

그런 종류의 수동 도구를 사용하고 싶지 않다면 수상자가 ProFactor의 "IncludeManager"라는 도구입니다.

http://www.profactor.co.uk/includemanager.php

무료 평가판이 있으며 훌륭합니다. 완전히 통합 된 Visual Studio 용 플러그인이므로 여기를 두 번 클릭하면 포함 된 곳으로 이동합니다.

툴팁 마우스 오버는 원하는 모든 정보를 제공하며 드릴 다운 / 업, 관심없는 전체 하위 트리 제거, 그래프 이외의 표현보기, 이에 대한 일치 목록 순환 등을 수행 할 수 있습니다.

만약 당신이 그것에 대해 빨리한다면, 당신은 시험이 다 떨어지기 전에 큰 프로젝트의 #include 구조를 리팩토링 할 수 있습니다. 그럼에도 불구하고 라이센스 당 약 $ 35의 비용이 들지 않습니다.

그것이하는 일에 대해서는 거의 완벽합니다. #include 그래프뿐만 아니라 공유 파일의 프로젝트 의존성, 빌드 시간에 미치는 영향, 그리드의 세부 속성, 완벽한.


C 프로젝트에서 IncludeManager를 성공적으로 사용했습니다. Visual Studio 2013을 사용하고 있습니다.
smwikipedia

의심스러워
sdd

12

좋은 소식 : redhat Source-Navigator (Windows에서도 실행). 물론 컴파일러 스위치 (앞서 언급)는 우수한 구문 분석을 가지고 있으며 이것이 MFC, Qt 및 해당 마술 키워드를 어떻게 처리하는지 잘 모르겠습니다.

redhat 소스 네비게이터


5

KeithB의 답변바탕으로 다음은 자동으로 1) 종속성 파일을 생성하고 2) 최신 파일을 유지하며 3) makefile에서 사용하는 GNUmake 구문입니다.

.dep:
    mkdir $@
.dep/%.dep: %.c .dep
    (echo $@ \\; $(CC) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
.dep/%.dep: %.cpp .dep
    (echo $@ \\; $(CXX) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
DEPEND := $(patsubst %.dep,.dep/%.dep,$(OBJ:.o=.dep))
-include $(DEPEND)

들여 쓰기를 하드 탭으로 변경하십시오.



3

C ++을 이해 하면 도움이 될 것입니다. Perl에서 액세스 할 수있는 데이터베이스를 빌드합니다.


이해는 상업적이지만 놀라운 IMO입니다. 무료로 사용해 볼 수 있습니다.
skelliam

1

cscope ( http://cscope.sourceforge.net/ )는 독립형 xterm에서이 작업을 수행하며 즐겨 사용하는 편집기 내에서 사용할 수 있습니다. 뛰어난 emacs 및 vi / vim 지원 기능이 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.