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.
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.
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.
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.
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ą.
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.
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.
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.
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.
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:
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.
#include
zależnościami, takimi jak zależności cpp , iwyu i dep-matrix, co jest dość naiwnym narzędziem napisanym w Pythonie.Odpowiedzi:
Jeśli masz dostęp do GCC / G ++,
-M
opcja 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.źródło
-H
nawet daje drzewo!-MM
pomija nagłówki systemowe-o
opcją kompilator zapisze dane wyjściowe do pliku zamiast na standardowe wyjście.stderr
zamiaststdout
. W przeciwnym razie ta opcja jest bardziej ogólna.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.
źródło
math.h
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.
źródło
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ą.
źródło
.cc/.c/.cxx
pliku (tylko.h
pliki w nim), może być nadmiarowy.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.
źródło
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.
źródło
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:
(Pamiętaj, aby zmienić te wcięcia na twarde karty).
źródło
Możesz również sprawdzić makedepend :
http://en.wikipedia.org/wiki/Makedepend
http://www.xfree86.org/current/makedepend.1.html
źródło
Zrozumienie C ++ powinno być w stanie ci pomóc: buduje bazę danych, do której możesz uzyskać dostęp z Perla.
źródło
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.
źródło
Istnieje bezpłatne narzędzie Dołącz obserwację zależności plików
źródło