Bagaimana cara mengetahui dari mana file header disertakan?

101

Bagaimana cara mengetahui di mana g ++ dapat menemukan file yang disertakan? Pada dasarnya jika saya

#include <foo.h>

g ++ akan memindai jalur pencarian, menggunakan opsi penyertaan apa pun untuk menambah atau mengubah jalur. Tetapi, pada akhirnya, apakah ada cara saya dapat memberi tahu jalur absolut dari foo.h yang dipilih g ++ untuk dikompilasi? Terutama relevan jika ada lebih dari satu foo.h di berbagai jalur pencarian.

Singkatnya cara untuk mencapai itu ... apakah ada cara untuk mendapatkan g ++ untuk memberi tahu saya apa jalur pencarian terakhirnya setelah memasukkan default dan semua termasuk opsi?

perangkat keras
sumber
1
Terkait: apakah ada cara untuk mengetahui dari orang tua mana file include (s) tempat anak include file itu dimasukkan? Yaitu untuk menunjukkan grafik yang disertakan-dari (Petunjuk: gcc -E tidak cukup di sana ... mungkin diproses untuk menghasilkannya.)
Krazy Glew

Jawaban:

79

Ini akan memberikan dependensi yang mencantumkan jalur absolut dari file yang disertakan:

gcc  -M showtime.c

Jika Anda tidak ingin sistem menyertakan (yaitu #include <something.h>), gunakan:

gcc  -MM showtime.c
Sodved
sumber
18
Perlu dicatat bahwa jika Anda menggunakan bersama dengan "-o myObj.o", outputnya, bukan biner yang dikompilasi, akan masuk ke "myObj.o". -M memiliki -E implisit, jadi kompilasi tidak dilakukan. Saya menemukan -MD adalah opsi yang sangat berguna sebagai gantinya, ia melakukan kompilasi dan menempatkan output di myObj.d sebagai gantinya. Membuat param yang cocok untuk hanya melakukan prepending ke baris kompilasi Anda tanpa efek aneh seperti * .o sekarang berisi keluaran, bukan biner. Terima kasih atas bantuan Anda.
harschware
Semua opsi gcc terkait dijelaskan di sini .
akhan
108
g++ -H ...

juga akan mencetak jalur lengkap file yang disertakan dalam format yang menunjukkan header mana yang menyertakan file

Magnet peluru
sumber
7
Ini tampaknya lebih membantu daripada -M menurut pengalaman saya. Saya suka tampilan hierarki dari apa yang termasuk apa.
Brian Minton
Bagus, ini membantu untuk tujuan debug.
1
Ini jawaban terbaik. Anda dapat menambahkannya ke proses build Anda tanpa mengubah apa pun.
Timmmm
4
Ini benar-benar menjawab pertanyaan lebih dari jawaban yang diterima. Satu-satunya masalah yang disayangkan adalah saya tidak dapat menghentikan Clang untuk mencoba mengompilasi file secara normal, jadi saya akhirnya menggunakan clang++ -MM -H(yang merupakan kombinasi yang sedikit berguna).
rookie1024
@ rookie1024 Gunakan clang++ -H -fsyntax-only ...jika Anda ingin menghindari menghasilkan file keluaran (juga berfungsi gcc).
Lekensteyn
8

Tentu digunakan

g++ -E -dI  ... (whatever the original command arguments were)
wallyk
sumber
2
Ada beberapa manfaat untuk solusi ini: 1. Anda dapat menemukan beberapa inklusi dari satu file header (-H dan -M mencetak setiap file yang disertakan hanya sekali) 2. Anda dapat melihat di mana file tersebut disertakan (nama dan nomor baris dokumen asli termasuk instruksi). 3. Dengan demikian Anda dapat dengan andal (!) Membedakan apakah tajuk disertakan secara langsung atau tidak langsung atau keduanya (Ini penting untuk pembersihan.)
hagello
5

Jika Anda menggunakan -MMatau salah satu opsi terkait ( -M, dll), Anda hanya mendapatkan daftar header yang disertakan tanpa semua output preprocessor lainnya (yang sepertinya Anda dapatkan dengan g++ -E -dIsolusi yang disarankan ).

Jonathan Leffler
sumber
g++ -MM t.cctidak menunjukkan inklusi sama sekali, adil t.o: t.cc. Apakah itu membutuhkan sesuatu yang lain?
wallyk
3
Bagus - untuk kelengkapan, Anda bisa mendapatkan yang serupa dengan MSVC menggunakan /showIncludesopsi. MSVC bahkan akan membuat indentasi untuk menampilkan tajuk bersarang (Saya tidak melihatnya -Mdi GCC).
Michael Burr