2008-12-05 27 views
144

在Unix系統上,gcc在哪裏查找頭文件?gcc在哪裏查找C和C++頭文件?

今天早上我花了一點時間尋找一些系統頭文件,所以我認爲這是很好的信息。

+1

有幫助的信息!謝謝你。 – 2008-12-05 16:58:36

回答

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

此命令要求該C++預處理器是使用gcc,然後要求該預處理器,其中它將查找包括。

對於您的特定設置,您將得到可靠的答案。

同樣地,對於Ç預處理:

echo $C_INCLUDE_PATH 

如果此:

`gcc -print-prog-name=cc1` -v 
16

GCC ManualCPP Section表明,頭文件可能位於以下目錄:

GCC看起來在幾個不同的地方頭。在一個正常的Unix系統中,如果您沒有另行指示它,它會尋找與#包括請求頭:

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

對於C++程序,它也將查找/ usr/include/g ++ - v3,首先。

+0

這對您當前版本的gcc很好。它看起來的實際目錄取決於gcc構建時指定的選項。請參閱Shmoopty答案以獲得更好的解決方案。 – 2008-12-05 17:08:48

+0

PS:我的C++頭文件位於:/usr/include/c++/4.0.0 – 2008-12-05 17:10:40

+2

@Martin:你是個老派。我在/usr/include/c++/4.2 :) – 2008-12-05 17:20:56

26

此外,GCC將看在-I選項後指定的目錄。


+1

謝謝。這是很好的信息補充。 – 2008-12-05 16:16:00

23

您可以創建一個試圖包含僞造系統標頭的文件。 如果您在這種源上以詳細模式運行gcc,它將列出所有系統包含位置,因爲它會查找僞造頭。

$ echo "#include <bogus.h> int main(){}" > 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 
0

人們可以查看(附加的)通過檢查以下包括從bash的一個C程序路徑是空的,它可以被修改爲添加默認包含位置,通過:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include 
5

爲了讓GCC打印出一套完整的目錄,在那裏將尋找系統頭,調用它是這樣的:

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

將產生形式的輸出

#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 - 命令行上的系列選項會影響打印的內容。

(該sed命令是擺脫所有其他垃圾這個調用打印,而且LC_ALL=C是確保sed命令工作 - 在「從這裏開始」和「搜索列表結束」短語翻譯IIRC)

4
g++ -print-search-dirs 
gcc -print-search-dirs 
1

的一組路徑,其中編譯器查找頭文件可以通過在命令進行檢查: -

CPP -v

如果聲明的#include「」,在源文件的當前目錄下的編譯器首先搜索,如果沒有找到,繼續在上面檢索的搜索目錄。

如果聲明的#include <>,編譯器搜索直接在由上述命令獲得的那些目錄。

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

0

這些是GCC看起來在默認情況下,指定的頭文件(假定頭文件被包含在V形<>)的目錄; 1./usr/local/include/- 用於第三方頭文件。 2./usr/include/- 用於系統頭文件。

如果您決定將您的自定義頭文件放在上述目錄以外的位置,可以按如下方式包含它們: 1.在文件中使用引號(「./custom_header_files/foo.h」)路徑,而不是包含語句中的V形。 2.編譯代碼時使用-I開關。 gcc -I/home/user/custom_headers/-c foo.c -p foo.o 基本上,-I開關告訴編譯器首先查看-I開關指定的目錄(在檢查標準目錄之前) 。使用-I開關時,可能會使用V形符號包含頭文件。