Windows XP (v140_xp) 編譯工具 ucrtbased.dll缺失
先寫結論,最好不要使用VS2015-WinXP編譯工具來編譯VC++程式,因為你最終會發現,編譯出來的程式如果是動態連結到執行庫的話,即便你已經拷貝了所有需要的執行庫dll,當在xp系統上執行時,還是會提示缺少ucrtbased.dll(Debug版)或者ucrtbase.dll(Release版)。
解決辦法有兩個:
1.靜態連結到執行時庫 (MT 或者 MTd) 如果使用了MFC,還要靜態連結到MFC
2.安裝VS2013 直接用VS2013-WinXP來編譯,編譯出的程式只要附帶上執行庫dll即可直接在XP上執行
下面記錄一下自己使用Visual Studio 2015 - Windows XP (v140_xp) 碰到的坑:
開始時,使用的VS2015 SP1,platform toolset選擇的Visual Studio 2015 - Windows XP (v140_xp) ,編譯出來debug版的程式,是動態連線到MFC和CRT的,我把所有需要的vc runtime dlls都拷貝到了xp虛擬機器裡面,但是發現程式無法執行,彈出無法找到ucrtbased.dll,於是google開始找解決辦法,微軟的官方說法是 VS2015修改了CRT runtime,增加了ucrtbase.dll這麼個元件,這個元件必須得作業系統安裝一個補丁才能有,直接把檔案拷貝過去是不行的。但是XP沒有這個補丁,最低是WIN7。
然後從VS2015SP2開始,微軟修復了這個問題,XP也可以安裝ucrtbase.dll這個元件了,方法就是必須安裝VS2015的vcredist_x86.exe,這個檔案的路徑在D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\1033下面,於是我開始更新我的VS2015,下載了SP3的更新包(
然後我用VS2015SP3重新編譯了release版的程式,並且在我xp的虛擬機器裡面安裝了SP3版本的vcredist_x86.exe,程式可以運行了。
但是還是有如下問題:
1.編譯出來的debug版的程式仍然無法在xp上執行,因為缺少ucrtbased.dll,我也沒有找到debug版的vcredist_x86.exe
2.我的程式沒有安裝包,我不想使用者在使用的時候還必須得安裝一個vcredist_x86.exe,那跟使用C#程式之前必須安裝一個.net framework有什麼區別?
最後我決定使用VS2013-Windows XP 來編譯我的程式,因為我電腦上之前裝有VS2013,後來裝的VS2015,所以工程-屬性裡面可以直接選擇VS2013的platform toolset。這樣的話就可以使用VS2015的IDE來寫程式碼,使用VS2013的編譯器來編譯生成程式。
而且我可以確定的說,VS2013-Windows XP編譯出來的無論是debug版還是release版,32位或者64位,只需將對應的VC Runtime dll拷貝到程式目錄下,就可以直接在XP上執行,方便除錯和使用。
至於說如何為VS2015安裝VS2013的平臺工具集(platform toolset),老老實實再裝一個VS2013吧,裝完之後,VS2015裡面會自動識別出來的。簡單的辦法我用google也沒有找到,如果誰找到了,評論裡面留言下,多謝~。畢竟再裝一個VS2013是要花很多時間和精力的~~