Pada sistem Unix, di mana gcc mencari file header?
Saya menghabiskan sedikit waktu pagi ini untuk mencari beberapa file header sistem, jadi saya pikir ini akan menjadi informasi yang baik untuk dimiliki di sini.
Pada sistem Unix, di mana gcc mencari file header?
Saya menghabiskan sedikit waktu pagi ini untuk mencari beberapa file header sistem, jadi saya pikir ini akan menjadi informasi yang baik untuk dimiliki di sini.
Jawaban:
`gcc -print-prog-name=cc1plus` -v
Perintah ini menanyakan gcc preprocessor C ++ mana yang digunakannya, dan kemudian menanyakan preprocessor yang dicari termasuk.
Anda akan mendapatkan jawaban yang andal untuk pengaturan spesifik Anda.
Demikian juga untuk preprosesor C :
`gcc -print-prog-name=cpp` -v
cpp
bukan cc1
? Pada debian jessie saya $(gcc -print-prog-name=cpp) -v
(dengan benar) memberikan satu jalan lagi, yaitu/usr/include/x86_64-linux-gnu
/dev/null
, jadi `gcc -print-prog-name=cc1` -v < /dev/null
.
Ctrl
+ D
, yang mengirim "end of file" di Unix-talk.
Selain itu, gcc akan mencari di direktori yang ditentukan setelah -I
opsi.
Anda dapat membuat file yang mencoba memasukkan header sistem palsu. Jika Anda menjalankan gcc dalam mode verbose pada sumber seperti itu, ia akan mendaftar semua sistem termasuk lokasi saat mencari header palsu.
$ 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
atau cpp -v < /dev/null
cukup. Anda hanya perlu mendapatkan preprocessor untuk menjalankan , tidak peduli apa masukan yang dilihatnya. (Jalur pencarian dicetak selama startup, bahkan sebelum melihat inputnya.)
Bagian CPP dari Manual GCC menunjukkan bahwa file header dapat ditemukan di direktori berikut:
GCC mencari di beberapa tempat berbeda untuk tajuk. Pada sistem Unix yang normal, jika Anda tidak menginstruksikan sebaliknya, ia akan mencari header yang diminta dengan #sertakan dalam:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Untuk program C ++, ini juga akan mencari di / usr / include / g ++ - v3, pertama.
Untuk mendapatkan GCC untuk mencetak set lengkap direktori di mana ia akan mencari header sistem, jalankan seperti ini:
$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 |
LC_ALL=C sed -ne '/starts here/,/End of/p'
yang akan menghasilkan output formulir
#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.
Jika Anda memiliki -I
opsi -family pada baris perintah, mereka akan memengaruhi apa yang dicetak.
(The sed
perintah untuk menyingkirkan semua lainnya sampah doa ini cetakan, dan LC_ALL=C
adalah untuk memastikan bahwa sed
perintah bekerja - yang "dimulai di sini" dan "End of daftar pencarian" frase yang diterjemahkan IIRC.)
g++ -print-search-dirs
gcc -print-search-dirs
Himpunan jalur tempat kompiler mencari file header dapat diperiksa dengan perintah: -
cpp -v
Jika Anda mendeklarasikan #include "" , kompiler pertama-tama mencari di direktori file sumber saat ini dan jika tidak ditemukan, terus mencari di direktori yang diambil di atas.
Jika Anda mendeklarasikan #sertakan <> , kompiler akan mencari langsung di direktori yang diperoleh dari perintah di atas.
Sumber: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
Orang dapat melihat path (tambahan) termasuk untuk program C dari bash dengan memeriksa yang berikut:
echo $C_INCLUDE_PATH
Jika ini kosong, ini dapat dimodifikasi untuk menambahkan default termasuk lokasi, dengan:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
Ini adalah direktori yang gcc mencari secara default untuk file header yang ditentukan (mengingat bahwa file header termasuk dalam chevron <>); 1. / usr / local / include / --digunakan untuk file header pihak ke-3. 2. / usr / include / - digunakan untuk file header sistem.
Jika Anda memutuskan untuk meletakkan file header khusus Anda di tempat selain dari direktori yang disebutkan di atas, Anda dapat memasukkannya sebagai berikut: 1. menggunakan tanda kutip ("./custom_header_files/foo.h") dengan path file, alih-alih chevron dalam pernyataan sertakan. 2. menggunakan -I switch ketika mengkompilasi kode. gcc -I / home / user / custom_headers / -c foo.c -p foo.o Pada dasarnya -I switch memberitahu kompiler untuk pertama kali melihat dalam direktori yang ditentukan dengan -I switch (sebelum memeriksa direktori standar) .Ketika menggunakan -Saya beralih file header dapat dimasukkan menggunakan chevron.