2009-07-08 43 views
3

在我的一些VS 2005項目中,當我更改包含文件時,某些cpp文件不會重建,即使它們中包含簡單的#include行。當包含文件被更改時,visual studio如何知道重建哪些cpp文件?

這是一個已知的錯誤,或者對項目有些奇怪嗎?有沒有關於VS如何解決依賴關係的信息,我可以查看這些文件嗎?

btw我嘗試了一些谷歌搜索,但沒有找到任何關於此。我可能需要正確的搜索字詞...

回答

2

我經常遇到這個問題,並與其他IDE也不只是VS.看起來他們的內部依賴樹有時會與現實脫節。在這些情況下,我發現刪除了預編譯頭文件(這很重要),並且執行完整的重建工作總能解決問題。幸運的是,它並不經常發生。

+0

是的完全重建修復它,但需要約40分鐘。我試圖讓我的機器上無人看管的構建。 – danio 2009-07-08 10:40:54

+0

@danio:我記得有這樣的問題。在這種情況下,我要麼重新啓動Visual Studio,要麼重建。爲什麼你必須重建所有?你不能只重建項目嗎? – ovanes 2009-07-08 11:46:46

2

說實話,我從來沒有面對使用Visual Studio的這樣一個問題。如果包含標題,您的CPP也應該重建。我能想到的唯一原因:相同的包含文件來自2個不同的來源。

您可以嘗試在編譯時通過啓用預處理器輸出預處理文件來進行調試。點擊CPP文件進入屬性,然後點擊C/C++ - >預處理器,然後在「生成預處理文件」中選擇包含或不包含行號的項目。

轉到您的包含文件把編譯指示各地新添加的定義,如:

#pragma starting_definition_X 
... 
#pragma ending_definition_X 

現在編譯一切。將會有一個新創建的文件與CPP具有相同的名稱,但擴展名爲.I(或.i)。

如果您的編譯指示在那裏,請進行搜索。如果不是,你的包含來自另一個地方。

如果你使用預編譯頭文件,你應該重建cpp。在MS VC中還有一個一次性使用pragma語句,它只解析包含文件一次,但仍然應該重新編譯你的cpp文件。

希望幫助,
Ovanes

+0

頭文件全部使用#pragma once或#ifdef衛兵,所以我不認爲這是問題的原因。有趣的是,可以存儲預處理器輸出:謝謝,未來可能會派上用場... – danio 2009-07-10 10:18:43

+0

是的,我在做某種類型的混合預處理器元編程和通用元編程時使用了它。這是調試代碼生成的唯一方法。好處是你可以在頭文件或者cpp文件中放入任何編譯指示,稍後在預處理文件中找到它們,因爲預處理文件通常非常大,因爲優化編譯器分配了大文件並在其中插入了擴展包含,否則它每次插入中間文件時都必須重新寫入文件。由於編譯指示留在pp文件中,您可以簡單地搜索它們並找到您感興趣的代碼段。 – ovanes 2009-07-10 11:41:24

0

Visual Studio的比較上的文件的時間戳。所以你可能想要檢查你的系統時鐘設置是否正確,並且沒有一個文件有一個有趣的時間戳。查看包含文件,cpp文件,pch文件和obj文件,並確保所有時間戳看起來合理。尤其要確保它們都不在將來。

+0

感謝但時間看起來OK。 .h比.bj更新,比.cpp更新。我們在這裏沒有使用pch。 – danio 2009-07-08 10:36:58

0

項目中是否添加了.h文件?如果不是,那麼vs可能無法找出依賴關係。

0

感謝他們幫助我指出了正確方向的所有答案。

我發現刪除idb文件並重建將允許隨後修改.h文件,以便生成正確的.cpp文件。然而,這導致整個項目的重建,這讓我回到尼爾·巴特沃斯提出的全面重建的建議。我不認爲我能做些什麼。

另一方面,看壞的和好的IDB文件,我可以看到沒有被構建的cpp文件不在壞的IDB中,而是在好的IDB中。在兩個文件中多次提到正在更改的頭文件。

win_pdbx(download)可以提取idb文件,moyix已發佈some information關於這些文件中的流。 流4包含cpp文件的文件路徑,但我無法確定格式。

相關問題