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.
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:
`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
cpp
yerine cc1
? Benim debian jessie $(gcc -print-prog-name=cpp) -v
(doğru) bir yol daha verir, bu/usr/include/x86_64-linux-gnu
/dev/null
yüzden `gcc -print-prog-name=cc1` -v < /dev/null
.
Ctrl
+ tuşuna basın D
.
Ek olarak, gcc -I
seçenekten sonra belirtilen dizinlere bakacaktır .
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
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
ya cpp -v < /dev/null
da yeter. Sadece önişlemciyi çalıştırmak zorundasınız , hangi girdiyi gördüğü önemli değil. (Arama yolları, girişine
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.
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.
-I
Komut satırında -family seçenekleriniz varsa , yazdırılanları etkiler.
( sed
Komut hepsinden kurtulmak için diğer önemsiz bu çağırma baskılar ve LC_ALL=C
sağlamaktır sed
- ibareleri "arama listesinde Sonu" "Burada başlar" ve komut eserleri vardır IIRC çevirdi.)
g++ -print-search-dirs
gcc -print-search-dirs
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
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
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.