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.


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.


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


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.


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


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.


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


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





Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.