Gcc, C ve C ++ başlık dosyalarını nerede arar?


186

Unix sisteminde, gcc başlık dosyalarını nerede arar?

Bu sabah bazı sistem başlık dosyalarını aramak için biraz zaman geçirdim, bu yüzden burada olması iyi bir bilgi olacağını düşündüm.

Yanıtlar:


227
`gcc -print-prog-name=cc1plus` -v

Bu komut gcc'ye hangi C ++ ön işlemcisini kullandığını sorar ve sonra bu önişlemcinin nerede aradığını içerir.

Özel kurulumunuz için güvenilir bir cevap alacaksınız.

Aynı şekilde, C önişlemcisi için:

`gcc -print-prog-name=cpp` -v

2
`Ne anlama geliyor? Bunu aramakta zorlanıyorum.
mijiturka


5
C tahmin önişlemci olduğunu cppyerine cc1? Benim debian jessie $(gcc -print-prog-name=cpp) -v(doğru) bir yol daha verir, bu/usr/include/x86_64-linux-gnu
wlnirvana

3
O girişi, gelen yönlendirme girişi için bekleyen asmak istiyorsanız /dev/nullyüzden `gcc -print-prog-name=cc1` -v < /dev/null.
Steve Jorgensen

@ErkekTerimleri Veya Unix-talk'ta "dosya sonu" gönderen Ctrl+ tuşuna basın D.
Drew Dormann

40

Ek olarak, gcc -Iseçenekten sonra belirtilen dizinlere bakacaktır .



4
@totaam: Yazı tipinizi kontrol edin! Bu cevapta "-I" değil (büyük "göz") "-l" değil (küçük harf "ell") kullanılır.

3
-I <anglebracketed.h>, -iquote "quotedfiles.h" içindir
jcomeau_ictx

28

Sahte sistem üstbilgisi eklemeye çalışan bir dosya oluşturabilirsiniz. Gcc'yi böyle bir kaynakta ayrıntılı modda çalıştırırsanız, sahte sistem başlığını ararken tüm sistem içerdiği konumları listeler.

$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c

[..]

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

[..]

t.c:1:32: error: bogus.h: No such file or directory

3
Ben sadece "-v seçeneğini kullanın" derseniz, daha yararlı olacağını düşünüyorum.
Jay Conrod

Eğer varolmayan bir sistem başlığı içeren bir C dosyası olmadan "-v" kullanırsanız, gcc'nin tüm içerme yollarını yinelemesine neden olmazsınız. Cevabımın anahtarı sistem başlığı olarak listelenen bogus.h.
diciu

@Jay - haklısın, çok belirsizdi - Kabuk senaryosunda ne yaptığımı açıkladım.
diciu

9
geçici dosyalar olmadan:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe

2
gcc -v -E - < /dev/nullya cpp -v < /dev/nullda yeter. Sadece önişlemciyi çalıştırmak zorundasınız , hangi girdiyi gördüğü önemli değil. (Arama yolları, girişine
bakmadan

17

CPP Bölüm ait GCC Kılavuzuna başlık dosyaları aşağıdaki dizinlerde bulunabilir gösterir:

GCC, başlıklar için birkaç farklı yere bakar. Normal bir Unix sisteminde, başka şekilde talimat vermezseniz, #include ile istenen başlıkları arayacaktır:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

C ++ programları için, önce / usr / include / g ++ - v3 dizinine de bakacaktır.


Mevcut gcc sürümünüz için bu iyi. Baktığı gerçek dizinler, gcc oluşturulduğunda belirtilen seçeneklere bağlıdır. Daha iyi bir çözüm için Shmoopty cevabına bakınız.
Martin York

Not: C ++ başlık dosyalarım: /usr/include/c++/4.0.0
Martin York

3
@ Martin: Sen eski okulsun. Benimki /usr/include/c++/4.2 :)
Bill the Lizard

10

GCC'nin sistem başlıklarını arayacağı tüm dizin kümesini yazdırmasını sağlamak için şu şekilde çağırın:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

formun çıktısını üretecek olan

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

-IKomut satırında -family seçenekleriniz varsa , yazdırılanları etkiler.

( sedKomut hepsinden kurtulmak için diğer önemsiz bu çağırma baskılar ve LC_ALL=Csağlamaktır sed- ibareleri "arama listesinde Sonu" "Burada başlar" ve komut eserleri vardır IIRC çevirdi.)


9
g++ -print-search-dirs
gcc -print-search-dirs

3
Bu komutlar, derleyici bağlantı kitaplıkları ve iç bileşenleri için varsayılan arama yollarını yazdırır; başlık dosyaları hakkında hiçbir şey söylemezler.
zwol

6

Derleyicinin başlık dosyalarını aradığı yol kümesi şu komutla denetlenebilir: -

cpp -v

Eğer bildirirseniz #include "" kaynak dosyasının geçerli dizinde, derleyici ilk aramaları ve bulunmazsa eğer, yukarıda alınan dizinleri aramaya devam eder.

Eğer bildirirseniz #include <> , doğrudan yukarıdaki komuta elde o dizinlerde derleyici arar.

Kaynak: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026


1

Aşağıdakileri kontrol ederek bir C programının bash'den (ilave) içerme yolunu görebilirsiniz:

echo $C_INCLUDE_PATH

Bu boşsa, varsayılan ekleme konumları eklemek için şu şekilde değiştirilebilir:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

1

Bunlar, gcc'nin varsayılan başlık dosyaları için varsayılan olarak baktığı dizinlerdir (başlık dosyalarının <> köşeli çift ayraçlarına dahil edildiği göz önüne alındığında); 1. / usr / local / include / - 3. taraf başlık dosyaları için kullanılır. 2. / usr / include / - sistem başlık dosyaları için kullanılır.

Özel başlık dosyanızı yukarıda belirtilen dizinlerden farklı bir yere koymaya karar verirseniz, bunları aşağıdaki gibi ekleyebilirsiniz: 1. köşeli çift ayraçları yerine dosya yoluyla tırnak işareti ("./custom_header_files/foo.h") kullanma include ifadesinde. 2. Kodu derlerken -I anahtarını kullanarak. gcc -I / home / user / custom_headers / -c foo.c -p foo.o Temel olarak -I anahtarı derleyiciye ilk önce -I anahtarıyla belirtilen dizine bakmasını söyler (standart dizinleri denetlemeden önce). -I anahtarını kullanarak başlık dosyaları köşeli çift ayraçları kullanılarak eklenebilir.

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.