2017-07-26 48 views
2

的我的源代碼的文件夾的結構定義如下:克++生成依賴文件錯過用戶定義的報頭

src 
|--c 
    |--c.h 
    |--c.cpp 

「CH」聲明瞭一個名爲「B」和「c.cpp」定義的類的'B'級。

假設我們現在在'src'文件夾中。我運行

g++ -I./ -MM -MT c/c.o -MF c/c.d c/c.cpp 

爲'c/c.cpp'生成依賴文件'c/c.d'。文件 'C/c.d' 的內容,但是,不通過

#include "c/c.h". 

但是包含 'C/CH' 即使我已經包括了 'C/CH' IN 'C/c.cpp' ,如果我們在文件夾'c'並運行上述命令,結果會不同。通過在上述過程中用'c.h'代替'c/c.h',我可以得到一個正確的依賴文件(意思是'c.h'在依賴文件中)。

任何人都知道爲什麼第一個進程錯過標題依賴的原因?

回答

0

這個奇怪的輸出是由變量CPLUS_INCLUDE_PATH引起的。我已經將其設置爲以下某個值:

CPLUS_INCLUDE_PATH=some_path: 

這尾巴「:」變量CPLUS_INCLUDE_PATH的是我的問題的原因。使用':'時,編譯器將'./'視爲系統文件夾,因此會自動從相關性列表中刪除與'./'相關的頭文件,如'c/c.h'。因此,如果我將CPLUS_INCLUDE_PATH設置爲

CPLUS_INCLUDE_PATH=some_path 

那麼問題就解決了。

3

this GCC webpage

「預處理程序查找由指令#include "file"第一部分相對於當前文件的目錄的報價表包含的頭文件,然後在標準的預配置列表系統目錄「。

這意味着當它看到#include "c/c.h"時,它會從當前文件的位置檢查名爲「c」的假設子目錄中的文件。

當您用#include "c.h"代替時,預處理器會檢查當前文件的目錄。

另一種選擇是將-I../添加到g ++的命令行參數中。

This GCC webpage提供預處理器搜索包含文件目錄的完整順序。查找順序如下:

  1. 對於include指令的引用形式,首先搜索當前文件的目錄。
  2. 對於include指令的引用形式,由-iquote選項指定的目錄按從左到右的順序搜索,如同它們出現在命令行中一樣。
  3. 使用-I選項指定的目錄按從左到右的順序掃描。
  4. 以-isystem選項指定的目錄按從左到右的順序掃描。
  5. 掃描標準系統目錄。
  6. 以-idirafter選項指定的目錄按從左到右的順序掃描。

請注意,您從中運行g ++的目錄不會出現在上面的列表中。這意味着,預處理程序不會而不是檢查您在命令行上運行g ++的目錄。原因是,你可以從任何目錄運行g ++,仍然可以得到相同的構建結果。

+0

我同意你說的大部分內容。 -I ../雖然不起作用。另外,向'src'摺疊添加-I絕對路徑也不起作用。 – user3677630

+0

@ user3677630 - 如果它不起作用,那你爲什麼接受答案?也許你應該把問題留給更多的時間,看看別人是否知道問題的答案。 – jww

+0

@jww「-I ../」的部分只是答案的一小部分。其餘部分仍然有效。只要這個答案的一部分解決了這個問題,這是正確的。 – RichS