簡體   English   中英

g ++生成依賴文件缺少用戶定義的標頭

[英]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網頁提供了預處理器在目錄中搜索包含文件的完整順序。 查找順序如下:

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

請注意,運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM