2009-08-02 134 views
60

所以,當我們做到以下幾點:在哪裏包括文件存儲 - Ubuntu Linux操作系統,GCC

#include <stdio.h> 

#include "myFile.h" 

編譯器,GCC在我的情況,知道哪裏是stdio.h中(甚至是目標文件)都位於我的硬盤上。它只是利用了我沒有互動的文件。

認爲在我的Ubuntu Linux機器上的文件存儲在/usr/include/編譯器如何知道在哪裏查找這些文件?這是可配置的還是僅僅是預期的默認值?我在哪裏尋找這種配置?

由於我對這些包含文件提出了一個問題,文件的來源是什麼?我知道在Linux社區中這可能是模糊的,但誰來管理這些?誰會爲Windows編譯器提供和管理相同的文件。

我一直的印象是,他們與編譯器,但是這是一個假設......

回答

40

在這裏看到:Search Path

摘要:

#include <stdio.h> 

當包含文件在括號中,預處理程序首先在通過-I標誌指定的路徑中搜索。然後它搜索標準包含路徑(請參閱上面的鏈接,並使用-v標誌在您的系統上進行測試)。

#include "myFile.h" 

當包括文件是在引號在當前目錄中的預處理器首先搜索,然後通過-iquote指定的路徑,然後-I路徑,則標準路徑。

-nostdinc可用於防止預處理器根本搜索標準路徑。

Environment variables也可用於添加搜索路徑。

編譯時如果使用-v標誌,您可以看到使用的搜索路徑。

7

Karl回答了您的搜索路徑問題,但就「文件來源」而言,有一點需要注意的是,如果您安裝libfoo軟件包並希望使用它進行一些開發(即,使用它的標題),您還需要安裝libfoo-dev。正如你所見,標準庫頭文件已經在/usr/include

請注意,一些具有大量標頭的庫將它們安裝到子目錄中,例如/usr/include/openssl。包括那些之一,僅需提供的路徑沒有/usr/include部分,例如:

#include <openssl/aes.h> 
41

GCC是一個豐富而複雜的「精心策劃」的程序來調用許多其他方案,以履行其職責。對於看到這裏#include "goo"#include <zap>將您的系統上搜索特定目的,我建議:

$ touch a.c 
$ gcc -v -E a.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. 
# 1 "a.c" 

這是看在搜索列表所包含的文件,其中包括(如果有的話)目錄成#include "..."會尋找一種方式但#include <...>不會。我展示這個具體名單實際上是在Mac OS X(又名達爾文),但我已經與...在這裏代替;-)任何系統上,我建議將顯示您的搜索列表的命令(以及有趣的配置細節哪個gcc運行正常。

+3

你能解釋一下從GCC哪裏知道在搜索/庫/在例子中,你所提供的框架?說,它是硬編碼在/ usr/include和/ usr/local/include中進行搜索,但是來自其他目錄的來自哪裏?來自環境? – rlib 2013-09-27 12:09:14

1

GCC的\#include文件存儲在/usr/include。 g ++的標準包含文件存儲在/usr/include/c++中。

相關問題