Di mana gcc mencari file header C dan C ++?

186

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.

Bill the Lizard
sumber

Jawaban:

227
`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
Drew Dormann
sumber
2
Apa yang dimaksud dengan `s? Saya kesulitan mencari ini.
mijiturka
5
Saya kira C preprocessor adalah cppbukan cc1? Pada debian jessie saya $(gcc -print-prog-name=cpp) -v(dengan benar) memberikan satu jalan lagi, yaitu/usr/include/x86_64-linux-gnu
wlnirvana
3
Jika Anda ingin agar tidak menunggu input, redirect input dari /dev/null, jadi `gcc -print-prog-name=cc1` -v < /dev/null.
Steve Jorgensen
@SteveJorgensen ya! Atau tekan Ctrl+ D, yang mengirim "end of file" di Unix-talk.
Drew Dormann
40

Selain itu, gcc akan mencari di direktori yang ditentukan setelah -Iopsi.


robert
sumber
4
@totaam: Periksa font Anda! Jawaban ini menggunakan "-I" (modal "mata") bukan "-l" (huruf kecil "ell").
3
-I adalah untuk <anglebracketed.h> sedangkan -iquote adalah untuk "dikutipfiles.h"
jcomeau_ictx
28

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
diciu
sumber
3
Saya pikir ini akan lebih membantu jika Anda hanya mengatakan "gunakan opsi -v".
Jay Conrod
Nah jika Anda menggunakan "-v" tanpa file C yang menyertakan header sistem yang tidak ada, Anda tidak akan menyebabkan gcc untuk beralih melalui semua path yang disertakan. Kunci untuk jawaban saya adalah bogus.h terdaftar sebagai header sistem.
diciu
@ Jay - Anda benar, itu terlalu samar - saya sudah menjelaskan apa yang saya lakukan di skrip shell.
diciu
9
tanpa file sementara:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe
2
gcc -v -E - < /dev/nullatau cpp -v < /dev/nullcukup. Anda hanya perlu mendapatkan preprocessor untuk menjalankan , tidak peduli apa masukan yang dilihatnya. (Jalur pencarian dicetak selama startup, bahkan sebelum melihat inputnya.)
zwol
17

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.

Bill the Lizard
sumber
Itu bagus untuk versi gcc Anda saat ini. Direktori aktual yang terlihat tergantung pada opsi yang ditentukan ketika gcc dibangun. Lihat jawaban Shmoopty untuk solusi yang lebih baik.
Martin York
PS: File header C ++ saya ada di: /usr/include/c++/4.0.0
Martin York
3
@ Martin: Kau sekolah tua. Milik saya ada di /usr/include/c++/4.2 :)
Bill the Lizard
10

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 -Iopsi -family pada baris perintah, mereka akan memengaruhi apa yang dicetak.

(The sedperintah untuk menyingkirkan semua lainnya sampah doa ini cetakan, dan LC_ALL=Cadalah untuk memastikan bahwa sedperintah bekerja - yang "dimulai di sini" dan "End of daftar pencarian" frase yang diterjemahkan IIRC.)

zwol
sumber
9
g++ -print-search-dirs
gcc -print-search-dirs
pengguna292283
sumber
3
Perintah-perintah ini mencetak jalur pencarian default untuk pustaka tautan dan komponen internal kompiler; mereka tidak memberi tahu Anda apa pun tentang file header.
zwol
6

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

Suhas Chikkanna
sumber
1

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
pengguna2844647
sumber
1

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.

akhil tiwari
sumber