Come sapere da dove viene incluso un file di intestazione?


101

Come posso sapere dove g ++ è riuscito a trovare un file di inclusione? Fondamentalmente se io

#include <foo.h>

g ++ analizzerà il percorso di ricerca, utilizzando qualsiasi opzione di inclusione per aggiungere o modificare il percorso. Ma, alla fine dei giorni, c'è un modo in cui posso dire il percorso assoluto di foo.h che g ++ ha scelto di compilare? Particolarmente rilevante se c'è più di un foo.h nella miriade di percorsi di ricerca.

A corto di un modo per farlo ... c'è un modo per ottenere g ++ per dirmi qual è il suo percorso di ricerca finale dopo aver incluso i valori predefiniti e tutte le opzioni di inclusione?


1
Correlato: esiste un modo per sapere da quale file di inclusione principale è stato incluso un file di inclusione figlio? Vale a dire per mostrare il grafico incluso-da (Suggerimento: gcc -E non è proprio lì ... potrebbe essere elaborato per produrlo.)
Krazy Glew

Risposte:


79

Questo darà le dipendenze make che elencano i percorsi assoluti dei file include:

gcc  -M showtime.c

Se non vuoi che il sistema includa (cioè #include <something.h>) allora usa:

gcc  -MM showtime.c

18
Va notato che se si usa insieme a "-o myObj.o", l'output, non il binario compilato, va in "myObj.o". -M ha un -E implicito, quindi la compilazione non viene eseguita. Ho trovato invece -MD è un'opzione molto utile, esegue la compilazione e mette invece l'output in myObj.d. Creare un parametro adatto per anteporre la riga di compilazione senza effetti strani come * .o ora contiene l'output invece del binario. Grazie per l'aiuto.
harschware

Tutte le opzioni di gcc correlate sono descritte qui .
akhan

108
g++ -H ...

stamperà anche il percorso completo dei file di inclusione in un formato che mostra quale intestazione include quali


7
Questo sembra essere più utile di -M nella mia esperienza. Mi piace la visualizzazione gerarchica di ciò che include cosa.
Brian Minton

Bene, è utile per il debug.

1
Questa è la migliore risposta. Puoi aggiungerlo al tuo processo di costruzione senza cambiare nient'altro.
Timmmm

4
Questo risponde davvero alla domanda più che alla risposta accettata. L'unico problema sfortunato è che non sono riuscito a convincerlo a impedire a Clang di provare a compilare il file normalmente, quindi ho finito per usare clang++ -MM -H(che è una combinazione leggermente utile).
rookie1024

@ rookie1024 Utilizzare clang++ -H -fsyntax-only ...se si desidera evitare di generare file di output (funziona gccanche per ).
Lekensteyn

8

Sicuro da usare

g++ -E -dI  ... (whatever the original command arguments were)

2
Ci sono diversi vantaggi in questa soluzione: 1. Puoi scoprire più inclusioni di un singolo file di intestazione (-H e -M stampano ogni file incluso solo una volta) 2. Puoi vedere dove è incluso (nome e numero di riga dell'originale includere istruzioni). 3. In questo modo puoi distinguere in modo affidabile (!) Se un'intestazione è inclusa direttamente o indirettamente o entrambi (questo è importante per le pulizie.)
hagello

5

Se usi -MMo una delle opzioni correlate ( -M, ecc.), Ottieni solo l'elenco delle intestazioni incluse senza avere tutto l'altro output del preprocessore (che sembra ottenere con la g++ -E -dIsoluzione suggerita ).


g++ -MM t.ccnon mostra alcuna inclusione, solo t.o: t.cc. Serve qualcos'altro?
wallyk

3
Bello: per completezza, puoi ottenere qualcosa di simile con MSVC usando l' /showIncludesopzione. MSVC farà anche un rientro per mostrarti l'annidamento delle intestazioni (non lo vedo -Msu GCC).
Michael Burr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.