2016-04-25 157 views
7

在以前在Visual Studio中開發Windows上的C++項目時,Visual Studio版本將具有其自己版本的C和C++庫,並且您的項目將引用特定版本的Windows SDK以訪問標題用於訪問Win32平臺。如果您安裝了多個Windows SDK版本,則會有一個涉及環境變量的複雜系統,使您可以選擇默認情況下使用Windows SDK Visual Studio的哪個版本。什麼是Windows套件,它們是如何工作的?

這不是很好,讓它正常工作需要一點點挖掘,但它只是工作。

剛剛從VS2012升級到VS2015,在我看來,無論這個系統被替換爲徹底破碎,還是我只是不理解它。

  1. 升級包含conio.h的簡單VS2012 C++控制檯應用程序到VS2015中斷,沒有錯誤報告。爲什麼? conio.h不再存在於Visual Studio C/C++庫中,而是現在存在於Windows Kit 10中,升級該項目不會重置所用的SDK(如您所期望的那樣)。

  2. 在VS2015中創建一個全新的Hello World C++應用程序,C++項目包括繼承$(VC_IncludePath)和$(WindowsSDK_IncludePath)的目錄。 $(WindowsSDK_IncludePath)從C:\ Program Files(x86)\ Windows Kits \ 8.1中取出頭文件,而$(VC_IncludePath)從C:\ Program Files文件(x86)\ Windows Kits \ 10中取入頭文件。

如此簡單的項目升級失敗,升級時不報告錯誤。清理新的控制檯項目同時從兩個不同的Windows Kit安裝中拉出頭文件,並且現在我在C:\ Program Files(x86)\ Microsoft SDK和C:\ Program Files(x86)\ Windows Kits下具有8.1和10的條目。 Windows Kit 8.1包含Win32和WinRt頭文件,而Windows Kit 10包含C/C++頭文件。

我是否有錯誤配置和損壞的安裝,或者這是怎麼回事?

如果這混亂是應該如何,這是如何工作的?我試過在MSDN上搜索有關Windows套件的信息,但沒有發現任何關於Windows驅動程序套件的東西,這些套件曾經是完全不同的東西,但我不知道它是否仍然存在。

是否有任何我已經遺漏的文檔解釋了這個庫配置背後的基本原理以及它如何使用?

+3

微軟有一個非常困難和苛刻的客戶。它的名字是微軟。政治是無聊的,並沒有解決任何人的問題。您只需修復「項目」>「屬性」>「VC++目錄」>「包含目錄」。將其恢復爲$(VC_IncludePath); $(WindowsSDK_IncludePath),其值爲5個目錄。這可能會破壞你的項目,改爲使用C/C++> General> Additional Include Directories設置。 –

+0

我很抱歉,但我很難理解哪些部分是您需要解決的問題,哪些部分只是您抱怨的問題。如果你能夠提供一個簡單的代碼示例,那麼這可能會有所幫助。 – user34660

+0

我試圖瞭解Windows套件如何與舊的Windows SDK相關聯,以及如何預計將配置項目以使用它們的不同版本。這是一個Visual Studio項目配置問題,而不是代碼問題。如果你不明白或不感興趣,那很好,但請不要因爲你不感興趣而投票結束我的問題,因爲如果一個好的答案出現了,那對其他人來說仍然是非常有用的。 – Neutrino

回答

2

我幾次碰到這個問題的幾個不同的變種,問題解決了從VS2012升級到VS2015項目的頭文件和庫依賴項。

Hans的回覆我的問題的意見確實解決了問題的標題,但遇到相同的問題,對於庫依賴關係,我有什麼可能是一個更簡單的解決方案,也適用於失敗的庫依賴關係解決方案。

在VS2015中打開VS2012項目時,不執行自動升級。打開項目屬性並將常規 - >平臺工具集更改爲Visual Studio 2015(v140)可能會重現原始問題中描述的頭解析錯誤的變體或不同的庫相關性解析錯誤。

我發現解決這些問題的最簡單方法是打開項目屬性並轉到VC++目錄 - >包含目錄。在您可能已添加到項目中的任何路徑中,您可能會發現$(VCInstallDir)\ include; $(VCInstallDir \ atlmfc \ include; $(WindowsSDK_IncludePath)

單擊路徑以顯示下拉列表並單擊編輯,這將顯示一個對話框,包含三個部分,從上到下,明確定義的路徑,評估路徑和繼承路徑。最底部是一個複選框'從父項或項目默認值繼承',我一直髮現它最初是未選中的。

從顯式定義的包含路徑中刪除上述的$(VCInstallDir)\ include; $(VCInstallDir \ atlmfc \ include; $(WindowsSDK_IncludePath)條目並選擇'從父項目或項目默認值繼承'設置。任何頭文件相關性問題。

如果您還有庫引用問題,請執行與庫目錄條目相同的操作,編輯設置,刪除顯式平面條目並選擇「從父​​項目或項目默認值繼承」。 (即使你沒有看到任何鏈接器錯誤,也可能是一個好主意,否則當鏈接到VS2012的庫時,最終可能會使用VS2015的平臺工具集編譯器選項)。

我不知道爲什麼這是搞砸了我,當我還沒有遇到任何其他人有類似的問題,我以前沒有升級Visual Studio解決方案的問題。

我還沒有發現爲什麼某些版本的Windows Kits現在包含Windows平臺標題或C++庫標題,而以前的SDK始終包含平臺標題,而C++標題始終是Visual Studio安裝的一部分。看起來像這樣的變化應該有一個關於它的開發博客或其他文檔。但只要它有效,我就不會太在意。

我希望這有助於某人。

+0

「我還沒有發現爲什麼某些版本的Windows Kits現在包含Windows平臺標題或C++庫標題,而C++標題始終是Visual Studio安裝的一部分。」 ---我認爲在你升級VS的初期,它會升級你的程序的MFC庫,你的編譯器,你的VS GUI等等。這對於新程序來說很好,但由於不同的windows頭文件,編譯器差異導致的語言錯誤等,舊程序會有錯誤的參數。我懷疑這種改變是C++庫和VS GUI解耦以實現多功能性的一部分。 – user3070485

相關問題