2011-04-29 160 views
60

如何判斷g ++能夠找到包含文件?基本上如果我如何判斷頭文件包含在哪裏?

#include <foo.h> 

g ++將掃描搜索路徑,使用任何包含選項來添加或更改路徑。但是,在幾天結束時,是否有一種方法可以告訴g ++選擇編譯的foo.h的絕對路徑?如果在多種搜索路徑中有多個foo.h,尤其相關。

缺乏一種方法來實現...有沒有辦法讓g ++告訴我它的最終搜索路徑是什麼,包括默認和所有包含選項?

+1

相關:有什麼辦法可以告訴哪個父包含文件包含子包含文件?即(提示:gcc -E並不在那裏......可能會被處理以產生它)。 – 2013-01-08 22:53:46

回答

47

這會給使依賴其名單包括文件的絕對路徑:

gcc -M showtime.c 

如果您不希望系統包括(即#include <something.h>),然後使用:

gcc -MM showtime.c 
+12

應該注意的是,如果您與「-o myObj.o」一起使用,輸出(而不是編譯的二進制)會進入「myObj.o」。 -M有一個隱含的-E,所以編譯不成立。我發現-MD是一個非常有用的選項,它執行編譯並將輸出放在myObj.d中。爲你的編譯行做一個合適的參數,而不需要像* .o這樣的奇怪效果,現在包含輸出而不是二進制。謝謝你的幫助。 – harschware 2011-04-29 17:33:09

4

當然使用

g++ -E -dI ... (whatever the original command arguments were) 
3

如果使用-MM或相關的選項之一(-M,等等),你得到的只是所包含無需其他所有的預處理器輸出(你好像頭的列表以獲得建議的g++ -E -dI解決方案)。

+0

'g ++ -MM t.cc'根本不顯示包含,只是'to:t。 cc'。它需要別的東西嗎? – wallyk 2011-04-29 16:59:56

+1

不錯 - 爲了完整性,您可以使用'/ showIncludes'選項與MSVC相似。 MSVC甚至會縮進來顯示標題的嵌套(我沒有在GCC上看到'-M')。 – 2011-04-29 17:02:39

+0

@wallyk:試一下'-M' – 2011-04-29 17:03:25

58
g++ -H ... 

還將打印包含文件的完整路徑,其格式顯示哪個頭文件包含哪個文件夾。

+3

在我的經驗中,這似乎比-M更有幫助。我喜歡什麼包括什麼的分層顯示。 – 2013-12-18 13:17:23

+0

很好,這對調試目的很有幫助。 – 2015-03-15 03:01:49

+0

這是最好的答案。您可以將其添加到您的構建過程中,而無需更改任何其他內容 – Timmmm 2015-06-03 13:29:56

相關問題