版權聲明:本文爲燦哥哥http://blog.csdn.net/caoshangpa原創文章,轉載請標明出處。html
一.直接使用VS2012/VS2013/VS2015生成XP兼容的可執行程序web
Visual Studio剛發佈時沒打補丁,稱爲RTM版,以後會陸續發佈補丁,進行bug修復和功能加強。VS2010及以前版本的補丁爲Service Pack,VS2012及以後版本的補丁稱爲Update。這些補丁都是向下兼容的,好比說打了Update2補丁,就不須要再打Update1補丁了。redis
微軟官網上如今只能搜索到VS2010 Service Pack1https://www.microsoft.com/zh-cn/download/details.aspx?id=23691,從該補丁的系統要求能夠看出VS2010支持XP、Vista和Win7,可是不支持Win8和Win10。所以用VS2010生成的可執行程序能直接在XP上運行。windows
再來搜索一下VS2012,這裏以旗艦版https://www.microsoft.com/zh-cn/download/details.aspx?id=30678爲例,從它的系統要求能夠看出VS2012支持Win7和Win8,可是不支持XP和Win10。app
VS201三、VS2015和VS2017的系統要求信息這裏https://www.visualstudio.com/zh-cn/productinfo/vs-servicing-vs統一展現了出來,不用再去搜索了。VS2013也只支持Win7和Win8。從VS2015開始新增長了對Win10的支持。爲防止網頁失效,仍是截個圖吧。工具
也就是說理論上從VS2012開始,生成的可執行文件就不能再XP上運行了。可是因爲XP用戶量依然很大,微軟在發佈了VS2012 RTM沒多久,就緊接着發佈了Update1補丁,該補丁重要的改進有兩處,一是在平臺工具集裏添加了支持生成運行於XP的選項;二是添加了對C++11特性的支持。post
如何查看Visual Studio是否打了補丁,方法很簡單,點擊菜單「幫助」——>「關於 Microsoft Visual Studio」,以下圖所示,從圖中能夠看出個人VS2012是打過Update1補丁的。ui
新建一個基於對話框的MFC工程,名爲MFCApplication,而後進行以下設置。google
這樣生成的MFCApplication.exe放到XP中,雙擊直接能夠運行,不須要任何依賴,以下圖所示。spa
注意「所需最低版本」必定要設置爲5.01,若是設置爲5.0會提示錯誤「LNK4010:子系統版本號5.0無效;假定爲默認子系統版本」,以下圖所示。
這裏的默認子系統版本就是說,生成的可執行程序只能在VS2012默認支持的系統上運行,也就是Win7和Win8。若是設置爲5.02或者其餘值,雖然沒這個提示了,可是依然會假定爲默認子系統版本,放到XP上運行會依然會提示「不是有效的Win32應用程序」,以下圖所示。
至於爲什麼要設置爲5.01,能夠參考如下兩篇博客:
修改WINVER、_WIN32_WINNT和_MSC_VER
簡單的說就是5.01表示系統內核版本號,若是直接查看的話,會發現XP的內核版本號是5.1,可是Windows系統頭文件中卻將XP的內核版本號定義爲0x0501,所以這裏用的是5.01,而不是5.1。
至於VS2013和VS2015,若是隻是想生成兼容XP的可執行程序,是不須要打補丁的,由於它們向下兼容VS2012。所以有博客說VS2012必須打Update3補丁純屬扯淡。VS2017還沒用過,就不說了。
二.使用Qt5.7.0 VS2015生成XP兼容的可執行程序
使用Qt Creator新建一個基於窗口的test工程,而後在pro中加入:
Deploying Qt on XP and getting 「not a valid Win32 application」
Qt for Windows - Specific Issues
可是實測時,只需在pro中加入QMAKE_LFLAGS_WINDOWS= /SUBSYSTEM:WINDOWS,5.01(若是程序基於窗口),其餘的條件估計是默認設置的。
這些條件還比較好理解的,與直接使用VS時的設置相對應。SDK71就是兼容XP的庫,LIBS和INCLUDEPATH給出了其路徑,V140是VC的版本,即VS2015。
至於爲什麼用quote,可參考:Qt在pro文件中加入帶空格的路徑
這樣設置後,生成的test.exe放到XP,雙擊是不能運行的,會提示缺乏Qt庫,這是由於從官網下載的qt-opensource-windows-x86-msvc2015-5.7.0.exe安裝包裏包含的是Qt動態庫,因此發佈的可執行程序必須攜帶相關的Qt庫。這裏test.exe(Release版)須要Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll和於平臺相關的插件qwindows.dll,該插件在C:\Qt\Qt5.7.0VS2015\5.7\msvc2015\plugins\platforms目錄中,直接將platform文件夾拷貝到test.exe同級目錄便可,以下圖所示。
這樣一來雖然不缺Qt庫了,可是會缺乏VS2015運行時庫,提示「沒有找到MSVCP140.dll......」,以下圖所示。
畢竟該Qt5.7安裝包不是靜態編譯的,且編譯時沒有指定兼容XP,因此會依賴VS2015運行時庫。此時須要安裝VS2015的vcredist_x86.exe,vcredist_x86.exe如何獲取可參考: Qt查找依賴庫的簡單方法
將獲取的vcredist_x86.exe拷貝到XP中安裝便可,安裝界面以下圖所示。
安裝完成後,雙擊test.exe就能夠正常運行了,以下圖所示。