[英]g++ generate dependency file miss user defined headers
我的源代碼文件夾的結構定義如下:
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 / cd”。 但是,即使我已經在“ c / c.cpp”中的“ c / ch”中包含了“ c / ch”,文件“ c / c.d”的內容也不包含“ c / ch”。
#include "c/c.h".
但是,如果我們在文件夾“ c”中並運行上面的命令,結果將有所不同。 通過在上述過程中將“ c / ch”替換為“ ch”,我可以獲得正確的依賴文件(意味着“ ch”位於依賴文件中)。
任何人都知道為什么第一個進程錯過標頭依賴性的原因嗎?
根據此GCC網頁 ,
“預處理器首先相對於當前文件的目錄 ,然后在標准系統目錄的預配置列表中查找指令
#include "file"
的引號形式包含的頭文件。”
這意味着當它看到#include "c/ch"
,它將從當前文件的位置檢查名為“ c”的假設子目錄中的文件。
當您用#include "ch"
替換它時,預處理器將檢查當前文件的目錄。
另一種選擇是將-I../
添加到g ++的命令行參數中。
此GCC網頁提供了預處理器在目錄中搜索包含文件的完整順序。 查找順序如下:
請注意,運行g ++的目錄沒有出現在上面的列表中。 這意味着,預處理器不會檢查從您在命令行中運行G ++的目錄。 原因是您可以從任何目錄運行g ++並仍然獲得相同的構建結果。
此奇怪的輸出是由變量CPLUS_INCLUDE_PATH引起的。 我將其設置為以下值:
CPLUS_INCLUDE_PATH=some_path:
變量CPLUS_INCLUDE_PATH的尾部':'是造成我問題的原因。 使用“:”,編譯器將“ ./”視為系統文件夾,因此它會自動從依賴項列表中刪除與“ ./”相關的標頭,例如“ c / c.h”。 因此,如果我將CPLUS_INCLUDE_PATH設置為
CPLUS_INCLUDE_PATH=some_path
那么問題就解決了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.