版權聲明:本文為燦哥哥http://blog.csdn.net/caoshangpa原創文章,轉載請標明出處。
一.直接使用VS2012/VS2013/VS2015生成XP兼容的可執行程序
Visual Studio剛發布時沒打補丁,稱為RTM版,之后會陸續發布補丁,進行bug修復和功能增強。VS2010及之前版本的補丁為Service Pack,VS2012及之后版本的補丁稱為Update。這些補丁都是向下兼容的,比如說打了Update2補丁,就不需要再打Update1補丁了。
微軟官網上現在只能搜索到VS2010 Service Pack1https://www.microsoft.com/zh-cn/download/details.aspx?id=23691,從該補丁的系統要求可以看出VS2010支持XP、Vista和Win7,但是不支持Win8和Win10。因此用VS2010生成的可執行程序能直接在XP上運行。
再來搜索一下VS2012,這里以旗艦版https://www.microsoft.com/zh-cn/download/details.aspx?id=30678為例,從它的系統要求可以看出VS2012支持Win7和Win8,但是不支持XP和Win10。
VS2013、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特性的支持。
如何查看Visual Studio是否打了補丁,方法很簡單,點擊菜單“幫助”——>“關於 Microsoft Visual Studio”,如下圖所示,從圖中可以看出我的VS2012是打過Update1補丁的。
新建一個基於對話框的MFC工程,名為MFCApplication,然后進行如下設置。
這樣生成的MFCApplication.exe放到XP中,雙擊直接可以運行,不需要任何依賴,如下圖所示。
注意“所需最低版本”一定要設置為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中加入:
- win32 {
- QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
- QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01
- DEFINES += _ATL_XP_TARGETING
- QMAKE_CFLAGS += /D_USING_V140_SDK71_
- QMAKE_CXXFLAGS += /D_USING_V140_SDK71_
- LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib)
- INCLUDEPATH += $$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include)
- }
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就可以正常運行了,如下圖所示。