Narzędzie do śledzenia #include zależności [zamknięte]

175

Jakieś dobre sugestie? Wejście będzie nazwą pliku nagłówkowego, a wyjściem powinna być lista (najlepiej drzewo) wszystkich plików, w tym bezpośrednio lub pośrednio.

Agnel Kurian
źródło
4
Nie chodzi o „ulubione” dołączenia, które są ładnie wyświetlane w gcc, ale msvs nie. Więc my (ja) szukamy dowolnego narzędzia.
fantastyczny
70
Dlaczego pytania „niezwiązane na temat” są tak pomocne?
jfritz42
5
@ jfritz42: To powinno otrzymać nagrodę „Komentarz roku”! Jak jeden moderator może oznaczyć pytanie jako „nie na temat”, skoro jest tak wiele tematów i tylu użytkowników?
Totoro,
2
Chciałem zauważyć, że istnieje o wiele więcej narzędzi do radzenia sobie z #includezależnościami, takimi jak zależności cpp , iwyu i dep-matrix, co jest dość naiwnym narzędziem napisanym w Pythonie.
nonsensickle
3
@ jfritz42 Liczby są jasne: 123 głosy i 62 ulubione. Wiele osób tak to postrzega. Dziwne standardy SO. Wątpię też, żeby takie pytania dały te same świetne odpowiedzi na SuperUser.
Andreas,

Odpowiedzi:

148

Jeśli masz dostęp do GCC / G ++, -Mopcja wyświetli listę zależności. Nie robi żadnych dodatkowych rzeczy, które robią inne narzędzia, ale ponieważ pochodzi z kompilatora, nie ma szans, że pobierze pliki z „niewłaściwego” miejsca.

KeithB
źródło
60
-Hnawet daje drzewo!
SamB
28
-MMpomija nagłówki systemowe
TheJosh,
3
Również z -oopcją kompilator zapisze dane wyjściowe do pliku zamiast na standardowe wyjście.
Hi-Angel
2
@SamB Działa to tylko wtedy, gdy nie ma błędów i drukuje do stderrzamiast stdout. W przeciwnym razie ta opcja jest bardziej ogólna.
user877329
92

Dzięki KeithB. Poszukałem dokumentacji dla cl.exe (VS2008) i znalazłem flagę / showIncludes. W środowisku IDE można to ustawić na stronie właściwości dowolnego pliku CPP.

Zrzut ekranu

Agnel Kurian
źródło
1
Jest to niezwykle przydatne w rozwiązywaniu niektórych bardzo trudnych błędów / ostrzeżeń kompilacyjnych. Wielkie dzięki!
Ashwin Nanjappa,
Jest to również bardzo przydatne, gdy próbujesz zoptymalizować prekompilowane nagłówki!
fmuecke
Podczas pracy w VS myślę, że to najszybsze rozwiązanie mojego problemu ~ :-)
yaobin
Wydaje się, że to nie działa, jeśli jakiś nagłówek zawiera nagłówek std c, np.math.h
abergmeier
29

W przypadku ciężkiego rozwiązania powinieneś sprawdzić doxygen . Skanuje bazę kodu i tworzy witrynę internetową, która skutecznie dokumentuje kod. Jedną z wielu rzeczy, które pokazuje, są drzewa.

Jeśli chciałeś podłączyć dane wyjściowe tego narzędzia do innego procesu, może to nie działać dla Ciebie (chociaż doxygen obsługuje inne formaty, nie znam tej funkcji). Jeśli jednak chcesz po prostu przyjrzeć się zależnościom, powinno działać świetnie.

Matt Dillard
źródło
20

Bawiłem się narzędziem o nazwie cinclude2dot . Było to całkiem przydatne w zdobyciu dość dużej bazy kodu, kiedy przyszedłem tutaj do pracy. W końcu myślałem o zintegrowaniu go z naszą codzienną kompilacją.

Brian Stewart
źródło
2
To narzędzie działa wyjątkowo dobrze. Miałem problem z -M g ++ i doxygen.
sleeparrow
Napisałem skrypt w języku Python, aby odczytać dane wyjściowe cinclude2dot i uzyskać całą zależność na mapie, a następnie przejść do głębi, aby ostatecznie wyprowadzić las źródeł. Las, w którym nie ma żadnego .cc/.c/.cxxpliku (tylko .hpliki w nim), może być nadmiarowy.
shuva
12

Po pierwsze, cinclude2dot.pl to skrypt w Perlu, który analizuje kod C / C ++ i tworzy wykres zależności #include jako plik z kropką do wprowadzenia do graphviz.

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

Jeśli nie chcesz iść drogą tego rodzaju ręcznego narzędzia, zdecydowanym zwycięzcą jest moim zdaniem narzędzie znane jako „IncludeManager” firmy ProFactor.

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

Jest bezpłatna wersja próbna i jest niesamowita. Jest to wtyczka do programu Visual Studio, która jest całkowicie zintegrowana, więc dwukrotne kliknięcie czegoś tutaj przeniesie Cię do miejsca, w którym to się znajduje.

Podpowiedzi myszy podają wszystkie potrzebne informacje i pozwalają na drążenie w dół / w górę, usuwanie całych poddrzew, na których nie zależy, przeglądanie reprezentacji innych niż wykresy, przechodzenie przez listę dopasowań tego i tamtego, to wspaniałe.

Jeśli szybko się nad tym zastanowisz, możesz refaktoryzować strukturę #include dużych projektów przed zakończeniem okresu próbnego. Mimo to nie kosztuje dużo, około 35 USD za licencję.

Za to, co robi, jest prawie doskonały. Nie tylko # uwzględnij wykresy, ale także zależności między projektami współdzielonych plików, wpływ na czas kompilacji, szczegółowe właściwości w siatkach, idealne.

Allbite
źródło
Pomyślnie użyłem IncludeManager w moim projekcie C. Używam Visual Studio 2013.
smwikipedia
Trochę podejrzane.
SDD
12

Dobra wiadomość: redhat Source-Navigator (działa również pod Windows). Oczywiście przełączniki kompilatora (wspomniane wcześniej) mają lepsze parsowanie i nie jestem pewien, jak poradzi sobie z MFC, Qt i ich magicznymi słowami kluczowymi.

redhat Source-Navigator

Agnel Kurian
źródło
5

Opierając się na odpowiedzi KeithB , oto składnia GNUmake do automatycznego 1) generowania plików zależności, 2) utrzymywania ich aktualności i 3) używania ich w pliku makefile:

.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)

(Pamiętaj, aby zmienić te wcięcia na twarde karty).

cxw
źródło
3

Zrozumienie C ++ powinno być w stanie ci pomóc: buduje bazę danych, do której możesz uzyskać dostęp z Perla.

Xavier Nodet
źródło
Zrozum jest komercyjny, ale to niesamowita IMO. Możesz spróbować za darmo.
skelliam
1

cscope ( http://cscope.sourceforge.net/ ) robi to w samodzielnym xtermie, a także może być używany w twoim ulubionym edytorze - ma świetne wsparcie dla emacs i vi / vim.

svec
źródło