1. 背景

前幾天微軟VS2019都出了,而還在使用VS2015的人怎麼說也該升級到2017了吧?但是升級很多時候都是一步步、一批批升級的。平滑過度、無縫遷徙才能讓大家慢慢的嘗試新的事物,最後喜歡上新事物。一旦大家都喜歡新的,那麼升級IDE還不是名正言順?

說到這裡在順道給大家安利一波我業餘搞的開源CRT庫,VC-LTL(Chuyu-Team/VC-LTL):

  1. 它能減少程序體積……
  2. 它能擺脫UCRT的折磨,那一坨坨api-ms-win-crt-*相貌的屎……
  3. 它能避免FLS上限問題!
  4. 最後,VC-LTL與微軟原版源代碼級別兼容,同時針對XP提供了更好的兼容性!

2. 我的想法

既然要推動升級,當然要先讓工程支持2017或者更高版本。現在主要有二個問題,一個是平台工具集,還有一個是Windows SDK版本

我的想法很簡單,就是用VS2015打開時,平台工具集自動使用v140。同理,2017打開時也自動使用v141。同時自動使用當前電腦安裝的最高的SDK版本

這樣就避免了不同的人安裝了不同的編譯器、不同的SDK帶來的麻煩啦!

3. 最佳實踐

要實現上述效果其實並不複雜,下面鴨鴨來就具體說說怎麼做吧!

3.1. 自適應Windows SDK版本

屬性頁 - 配置屬性 - 常規 - Windows SDK版本填上$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion(Windows, 10.0)) 即可。

它將調用一個.Net的GetLatestSDKTargetPlatformVersion介面,獲取當前計算機中安裝的最高版本SDK。

3.2. 自適應平台工具集

屬性頁 - 配置屬性 - 常規 - 平台工具集 填上$(DefaultPlatformToolset) 即可。

大概意思就是使用默認工具集版本號,而這個版本號等於當前IDE的版本號,比如2017就是v141。

3.3. 靜態庫注意事項

雖然VS2015~2019 ABI兼容。但是由於VS默認開啟全程序優化(/GL), 如果你沒關閉,這將導致編譯出來的靜態庫(obj組成的那種),兼容性大大降低。為了保證lib文件的通用性,我建議所有靜態庫工程都關閉全程序優化(/GL)

屬性頁 - 配置屬性 - C/C++ - 優化 - 全程序優化 調整為

溫馨提示:只有靜態庫工程需要關閉,其他的比如說應用程序或者動態庫無需任何更改。

3.4. 啟用Windows XP兼容『可選』

如需完整支持Windows XP,建議使用VC-LTL(Chuyu-Team/VC-LTL)。兼容XP,減少程序體積,倆不誤!

最新的VS2019已經取消了XP模式,另外微軟原始提供的XP模式實在是慘不忍睹!因此,我建議需要XP模式的自行更改配置解決。

為此,我製作了一個屬性表——WinXP.props,內容如下:

<?xml version="1.0" encoding="utf-8"?>

<!--
此屬性表用於開啟Windows XP支持。
修訂日期:2017-07-26
作者:mingkuang
-->

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup Condition=" ($(PlatformShortName)==x86) Or ($(PlatformShortName)==x64) ">
<ClCompile>
<PreprocessorDefinitions >_ATL_XP_TARGETING=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<!--某些硬體不支持SSE2等高級指令-->
<EnableEnhancedInstructionSet Condition=" $(PlatformShortName)==x86 ">NoExtensions</EnableEnhancedInstructionSet>
<!--當兼容XP時,對於非 exe 的需要禁用線程安全初始化。避免XP中在DllMain中使用TLS而崩潰-->
<AdditionalOptions Condition=" $(ConfigurationType)!=Application ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<!--當兼容XP時,x86程序最低版本為5.1,x64程序最低版本為5.2-->
<MinimumRequiredVersion Condition=" $(PlatformShortName)==x86 ">5.01</MinimumRequiredVersion>
<MinimumRequiredVersion Condition=" $(PlatformShortName)==x64 ">5.02</MinimumRequiredVersion>
</Link>
</ItemDefinitionGroup>
</Project>

大家將上述內容使用UTF-8編碼保存為WinXP.props。 然後在IDE底部的屬性管理器- 添加現有屬性表,選擇WinXP.props即可。這樣就開啟了XP模式,並且自動規避所有已知問題。

如果沒有IDE界面底部沒有屬性管理器,那麼可以從菜單的「視圖」菜單中開啟。

4. 尾聲

好了,差不多就這樣吧~,如果有更好的建議或者問題,可莫要金屋藏嬌。

希望明年清明節大家一起給VS2015掃墓!


謝謝觀賞

——mingkuang


推薦閱讀:
相关文章