簡體   English   中英

vs2012工具集兼容性

[英]vs2012 toolset compatibility

在我的VS2012中,我有4個可用的工具集:v90,v100,v110和v110_xp。 我用兩個項目testlib(靜態庫)和testexe(控制台應用程序)做了一個簡單的測試。 界面只是一個帶有簽名void test()函數。 結果:

  • testlib(v90),testexe(v90以外的任何東西) - >不鏈接
  • testlib(v100),testexe(v110或v110_xp) - >確實鏈接

但是,對我來說,v100和v110會鏈接起來似乎有些奇怪,所以我試着讓場景復雜一點。 現在我的方法如下所示: std::map<std::string, std::string> test(const std::string& arg) 正如所料,testlib(v100)和testexe(v110)沒有鏈接( mismatch detected for '_MSC_VER' )。

但仍然testlib(v110)和testexe(v110_xp)進行鏈接,結果exe在Windows XP上運行。 這只是偶然的還是支持的情況? 如果這只是偶然的話,那么僅使用v110_xp中可用功能並打破這種兼容性的示例代碼將是受歡迎的。 我想知道是否應該將我的庫的兩個版本部署到我的客戶端,或者只是用v110編譯的那個版本。

“工具集”這個詞在描述v110和v110_xp之間的差異時有點用詞不當。 您仍在使用相同的構建工具。 而且你仍然擁有相同版本的CRT。 通過比較在兩個版本之間加載的DLL的Debug + Windows + Module列表中看到的內容,可以看到一些東西。 請注意msvcr110.dll的名稱和位置。

CRT實際上是由Update 1更新的,它現在支持XP和更新的Windows版本。 這是通過它在運行時動態綁定到后來的winapi函數,使用GetProcAddress(),如果在XP上運行時無法找到它們的話。

不同的是,你有另一個版本的Windows SDK。 最后一個仍然與XP版本7.1兼容。 您將在C:\\ Program Files(x86)\\ Microsoft SDKs \\ Windows \\ v7.1A中找到它。 使用v110工具集構建時,您將使用存儲在C:\\ Program Files(x86)\\ Windows Kits \\ 8.0中的SDK包含和庫文件

當您在c:\\ program files(x86)\\ msbuild目錄中搜索該字符串時,可以看到使用v110_xp時的特定更改:

  • include和lib文件等目錄已更改為Windows 7.1 SDK路徑
  • 添加了_USING_V110_SDK71_預處理程序符號,在其他任何重要位置都沒有使用
  • 鏈接器的/ SUBSYSTEM選項被更改為僅需要Windows版本5.02,XP版本號。

簡而言之,混合使用v110和v110_xp工具集構建的模塊不是問題。

官方不支持混合v110_xp可執行文件和v110庫。

與Microsoft單獨升級此問題后,他們回答了以下問題:

問題1:使用這些庫(v110)並使用工具集v110_xp構建的應用程序可以在Windows XP計算機上正常運行嗎?

只有使用v110_xp工具集構建的可執行文件才能在Windows XP計算機上正常運行。 因此,如果應用程序需要在Windows XP計算機上正常運行,則需要確保將項目從默認的v110工具集切換到項目屬性頁中新引入的v110_xp工具集,包括可執行文件和DLL。有任何。

Q2:我們是否需要發布使用工具集v110_xp構建的這些庫的另一個版本?

我認為這取決於您在部署應用程序時需要哪種平台。 如果您的部署計划包括Windows XP計算機,則必須發布使用v110_xp工具集構建的新版本的可執行文件/ DLL。 但是,考慮到使用v110_xp工具集構建的相同可執行文件/ DLL也將在Vista及更高版本上運行,我建議您可以保留使用v110_xp工具集構建的單個版本的可執行文件/ DLL,這可以在所有其他平台上運行。 當Windows XP不再在您的部署計划中時,您可以使用v110工具集轉換要重建的整個可執行文件/ DLL。 當然,如果你想分別針對Windows XP和其他系統,你可以同時維護兩個版本的可執行文件/ DLL,這將是一件好事。

問題3:Microsoft是否支持在Windows XP上使用工具集v110構建的庫?

答案是不。 如果要在Windows XP上正確運行應用程序,則需要在v110_xp模式下構建所有內容。

請不要將具有/導出類的DLL與不同版本的Visual Studio混合使用(即使是次要版本差異)。 STL和MFC具有基於模板構建的類(類本身可能不會為用戶模板化),這會阻止不同版本之間的鏈接和/或編譯。

一個簡單的例子是CString :與MFC的靜態和動態鏈接將具有不同的CString實現。 Unicode和ANSI CString也不同。 另一個例子是STL本身:Debug構建vector與發布構建vector不同。 此外,在STL集合的情況下,編譯器設置也將更改容器的大小/實現(如vectorlist )。

因此,最好不要將具有這些類型類的導出類/函數作為參數導入。 甚至不要以不透明的方式傳遞它們(就像在void-pointer之上)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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