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?


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

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


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)

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


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