Jak sprawdzić, skąd jest dołączony plik nagłówkowy?

101

Jak mogę sprawdzić, gdzie g ++ mógł znaleźć plik dołączany? Zasadniczo, jeśli ja

#include <foo.h>

g ++ przeskanuje ścieżkę wyszukiwania, używając dowolnych opcji dołączania, aby dodać lub zmienić ścieżkę. Ale, na koniec, czy jest sposób, bym mógł określić absolutną ścieżkę foo.h, którą g ++ wybrał do kompilacji? Jest to szczególnie istotne, jeśli w niezliczonych ścieżkach wyszukiwania znajduje się więcej niż jeden plik foo.h.

Krótko mówiąc, sposób na osiągnięcie tego ... czy istnieje sposób, aby g ++ powiedział mi, jaka jest jego ostateczna ścieżka wyszukiwania po uwzględnieniu domyślnych i wszystkich opcji dołączenia?

harschware
źródło
1
Powiązane: czy istnieje sposób, aby stwierdzić, z których plików nadrzędnych dołączono podrzędny plik dołączania? To znaczy, aby pokazać wykres dołączony z (Podpowiedź: gcc -E nie jest tam całkiem ... może zostać przetworzony, aby go uzyskać).
Krazy Glew

Odpowiedzi:

79

To da zależności make, które wyświetlają bezwzględne ścieżki plików nagłówkowych:

gcc  -M showtime.c

Jeśli nie chcesz, aby system zawierał (tj. #include <something.h>), Użyj:

gcc  -MM showtime.c
Sodved
źródło
18
Należy zauważyć, że jeśli użyjesz w połączeniu z "-o myObj.o", wyjście, a nie skompilowany plik binarny, trafi do "myObj.o". -M ma niejawne -E, więc kompilacja nie jest wykonywana. Odkryłem, że -MD jest bardzo przydatną opcją zamiast tego, wykonuje kompilację i zamiast tego umieszcza dane wyjściowe w myObj.d. Utworzenie odpowiedniego parametru po prostu poprzedzającego wiersz kompilacji bez dziwnych efektów, takich jak * .o, zawiera teraz wynik zamiast binarnego. Dzięki za pomoc.
harschware
Wszystkie powiązane opcje gcc są opisane tutaj .
akhan
108
g++ -H ...

wypisze również pełną ścieżkę plików dołączanych w formacie, który pokazuje, który nagłówek zawiera które

Magnes kulisty
źródło
7
Z mojego doświadczenia wynika, że ​​jest to bardziej pomocne niż -M. Podoba mi się hierarchiczne przedstawienie tego, co zawiera.
Brian Minton,
Dobrze, jest to pomocne przy debugowaniu.
1
To najlepsza odpowiedź. Możesz dodać go do procesu kompilacji, nie zmieniając niczego innego.
Timmmm
4
To naprawdę bardziej odpowiada na pytanie niż zaakceptowana odpowiedź. Jedynym niefortunnym problemem jest to, że nie udało mi się powstrzymać Clanga przed próbą normalnej kompilacji pliku, więc ostatecznie użyłem clang++ -MM -H(co jest nieco użyteczną kombinacją).
rookie1024
@ rookie1024 Użyj, clang++ -H -fsyntax-only ...jeśli chcesz uniknąć generowania plików wyjściowych (działa gccteż).
Lekensteyn
8

Jasne użycie

g++ -E -dI  ... (whatever the original command arguments were)
wallyk
źródło
2
To rozwiązanie ma kilka zalet: 1. Możesz wykryć wiele inkluzji w jednym pliku nagłówkowym (-H i -M drukuje każdy dołączony plik tylko raz) 2. Możesz zobaczyć, gdzie jest on zawarty (nazwa i numer wiersza oryginału zawiera instrukcję). 3. W ten sposób możesz niezawodnie (!) Rozróżnić, czy nagłówek jest dołączony bezpośrednio, pośrednio, czy oba (jest to ważne przy
porządkach
5

Jeśli używasz -MMlub jednej z powiązanych opcji ( -Mitp.), Otrzymasz tylko listę dołączonych nagłówków bez wszystkich innych danych wyjściowych preprocesora (które wydaje się uzyskiwać dzięki sugerowanemu g++ -E -dIrozwiązaniu).

Jonathan Leffler
źródło
g++ -MM t.ccnie pokazuje żadnego włączenia, po prostu t.o: t.cc. Czy potrzebuje czegoś innego?
wallyk
3
Nieźle - dla kompletności możesz uzyskać podobny efekt z MSVC, używając /showIncludesopcji. MSVC nawet wykona wcięcie, aby pokazać zagnieżdżenie nagłówków (nie widzę tego -Mw GCC).
Michael Burr