Bir başlık dosyasının nereden eklendiğini nasıl anlarım?


102

G ++ 'nın bir içerme dosyasını nerede bulabildiğini nasıl anlayabilirim? Temelde eğer ben

#include <foo.h>

g ++, yolu eklemek veya değiştirmek için herhangi bir dahil etme seçeneğini kullanarak arama yolunu tarayacaktır. Ancak, günlerin sonunda, g ++ 'nın derlemeyi seçtiği foo.h dosyasının mutlak yolunu söylememin bir yolu var mı? Çok sayıda arama yolunda birden fazla foo.h varsa özellikle önemlidir.

Bunu başarmanın kısa bir yolu ... g ++ 'ı, varsayılanları ve tüm içerme seçeneklerini dahil ettikten sonra son arama yolunun ne olduğunu söylemenin bir yolu var mı?


1
İlgili: Bir alt öğe ekleme dosyasının hangi üst öğe içerme dosyasından dahil edildiğini anlamanın bir yolu var mı? Yani dahil edilen grafiği göstermek için (İpucu: gcc -E tam olarak orada değil ... onu elde etmek için işlenebilir.)
Krazy Glew

Yanıtlar:


78

Bu, içerme dosyalarının mutlak yollarını listeleyen make bağımlılıkları verecektir:

gcc  -M showtime.c

Sistemin içermesini istemiyorsanız (yani #include <something.h>) şunu kullanın:

gcc  -MM showtime.c

18
"-O myObj.o" ile birlikte kullanırsanız, derlenen ikili dosya değil çıktının "myObj.o" içine gittiğine dikkat edilmelidir. -M örtük bir -E'ye sahiptir, bu nedenle derleme önceden biçimlendirilmez. -MD'nin bunun yerine çok kullanışlı bir seçenek olduğunu buldum, derlemeyi gerçekleştiriyor ve bunun yerine çıktıyı myObj.d'ye koyuyor. * .O gibi garip efektler olmadan sadece derleme satırınızın başına eklemek için uygun bir parametre oluşturmak artık ikili yerine çıktıyı içeriyor. Yardımınız için teşekkürler.
harschware

İlgili tüm gcc seçenekleri burada açıklanmaktadır .
akhan

111
g++ -H ...

ayrıca, include dosyalarının tam yolunu, hangi başlığın hangilerini içerdiğini gösteren bir biçimde yazdırır.


7
Bu benim deneyimime göre -M'den daha yararlı görünüyor. Neyin neyi içerdiğinin hiyerarşik görüntüsünü seviyorum.
Brian Minton

Güzel, hata ayıklama amacıyla yararlıdır.

1
Bu en iyi cevap. Başka hiçbir şeyi değiştirmeden bunu inşa sürecinize ekleyebilirsiniz.
Timmmm

4
Bu gerçekten soruyu kabul edilen cevaptan daha fazla cevaplıyor. Sadece talihsiz bir sorun, Clang'ın dosyayı normal şekilde derlemeye çalışmasını engelleyemediğim için clang++ -MM -H(bu biraz kullanışlı bir kombinasyon) kullanmayı bıraktım .
rookie1024

@ rookie1024 clang++ -H -fsyntax-only ...Çıktı dosyaları oluşturmaktan kaçınmak istiyorsanız kullanın (bunun için gccde geçerlidir).
Lekensteyn

8

Elbette kullanım

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

2
Bu çözümün çeşitli faydaları vardır: 1. Tek bir başlık dosyasının birden çok ekini keşfedebilirsiniz (-H ve -M dahil edilen her dosyayı yalnızca bir kez yazdırın) 2. Nereye dahil edildiğini görebilirsiniz (orijinalin adı ve satır numarası) talimat dahil). 3. Böylece, bir başlığın doğrudan mı yoksa dolaylı olarak mı yoksa her ikisinin birden mi dahil edileceğini güvenilir bir şekilde (!) Ayırt edebilirsiniz (Bu temizlik için önemlidir.)
hagello

5

Kullanırsanız -MMveya ilgili seçeneklerden birini ( -Mvb.) Kullanırsanız, diğer tüm önişlemci çıktısına sahip olmadan dahil edilen başlıkların listesini alırsınız (önerilen g++ -E -dIçözümle elde ettiğiniz görülüyor ).


g++ -MM t.cchiç dahil olmadığını gösteriyor, sadece t.o: t.cc. Başka bir şeye ihtiyacı var mı?
wallyk

3
Güzel - tamlık için, /showIncludesseçeneği kullanarak MSVC ile benzerler elde edebilirsiniz . MSVC, başlıkların iç içe geçtiğini göstermek için bile girinti yapacak (bunu -MGCC'de görmüyorum ).
Michael Burr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.