1. 程式人生 > >使用Qt5.7.0 VS2015版本生成相容XP的可執行程式

使用Qt5.7.0 VS2015版本生成相容XP的可執行程式

一.直接使用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上執行。


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,可以參考以下兩篇部落格:

簡單的說就是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中加入:

  1. win32 {  
  2. QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01  
  3. QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01  
  4. DEFINES += _ATL_XP_TARGETING  
  5. QMAKE_CFLAGS += /D_USING_V140_SDK71_  
  6. QMAKE_CXXFLAGS += /D_USING_V140_SDK71_  
  7. LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib)  
  8. INCLUDEPATH += $$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include)  
  9. }  
上面設定是參考瞭如下兩篇文章:

但是實測時,只需在pro中加入QMAKE_LFLAGS_WINDOWS=/SUBSYSTEM:WINDOWS,5.01(如果程式基於視窗),其他的條件估計是預設設定的。

這些條件還比較好理解的,與直接使用VS時的設定相對應。SDK71就是相容XP的庫,LIBS和INCLUDEPATH給出了其路徑,V140是VC的版本,即VS2015。

這樣設定後,生成的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就可以正常運行了,如下圖所示。