標籤:
環境:win10+vs2015+QT5.7.0
目標:編譯出能在windows xp上啟動並執行QT
通過baidu和bing找不出來的結果沒有一個能成功運行,大部分都能編譯成功,並完美解決“exe不是有效win32程式”,但是程式依舊沒法正常顯示視窗。
此時會有一個crash,具體位置是qwindows.dll,但是使用depends查看也沒看出來qwindows.dll有問題,有些人會遇到qwindows.dll依賴的
kernel32.dll在xp下沒有對應介面,具體介面不記得了,最後看到是QT5.5的問題,已經被修複了。
反覆嘗試http://www.cnblogs.com/bbxx111/p/5461069.html這個文章中的辦法,整整3次編譯,依舊不行,期間改過qt-build。bat指令碼裡面的SET CL=/D_USING_V140_SDK71_;%CL%,按照文章的bat始終會有“__useHeader”重複定義的警告,作為軟體開發,我是受不了此類警告的,按照官方的doc(http://doc.qt.io/qt-5/windows-issues.html),修改bat警告依舊,最後整合stackoverflow和qt的論壇經驗編譯成功。
最後的編譯方法如下:
修改%QTDIR%\qtbase\qmake\Makefile.win32,在CFLAGS_BARE後加入-D_USING_V110_SDK71_修改%QTDIR%\qtbase\mkspecs\common\msvc-desktop.conf,在DEFINES中加入_USING_V110_SDK71_;修改QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01修改QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01QTDIR是QT源碼的目錄。qt-build.bat如下:REM Set up \Microsoft Visual Studio 2015, where <arch> is amd64, x86, etc.CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86REM ********** Update include & lib to support xp win sdk 7.1A **********SET PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin;%PATH%SET INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;%INCLUDE%SET LIB=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib;%LIB%SET CL=/D_USING_V110_SDK71_;%CL%REM ********** 3rd party build tools binaries: ruby, perl, python ********** SET PATH=C:\Ruby23-x64\bin;C:\Perl64\bin;C:\Python27;%PATH%REM ********** Set up qt source env **********SET _ROOT=C:\Qt\qt-everywhere-opensource-src-5.7.0SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH%REM Uncomment the below line when using a git checkout of the source repositoryREM SET PATH=%_ROOT%\qtrepotools\bin;%PATH%SET QMAKESPEC=win32-msvc2015set _ROOT=REM Generate makefileconfigure.bat -mp -confirm-license -opensource -platform win32-msvc2015 -developer-build
-shared -target xp -prefix D:\Qt5.7.0-shared-win32-vs2015-xp -qt-sql-sqlite -qt-sql-odbc
-plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop
-qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples -skip qtquickcontrols
-skip qtquickcontrols2 -skip qtsensors -no-directwrite
為了排版好看,最後的配置加入了換行,如果需要複製的請注意去掉換行,避免編譯異常。
剩下的就是執行nmake,大概2個小時左右,編譯完成後執行nmake install進行安裝,上面指令碼裡配置的安裝路徑是D:\Qt5.7.0-shared-win32-vs2015-xp。
上面的方法可能存在冗餘的東西,項目追得緊,先解決項目後再來仔細推敲和完善。
對於這個方法需要說明的2點:
1、vs2012之後需要編譯能在xp上啟動並執行程式必須且只能定義宏_USING_V110_SDK71_,有些人會說V110不是要跟著vs的版本走嗎?如果你去嘗試解決__useHeader宏重定義時就會發現,vs2015裡的標頭檔裡面判斷的也是_USING_V110_SDK71_。
2、configure配置指令碼裡面關鍵點是-target xp和-no-directwrite,第一個是配置目標平台為xp,第二個是windows字型渲染的方式。傳送口在這裡:https://msdn.microsoft.com/zh-cn/library/windows/apps/dd368038.aspx,文中明確指出directwrite必須windows 7以上的平台。
directwrite的配置要感謝https://forum.qt.io/topic/62162/qt-5-6-doesn-t-compatible-with-windows-xp/12的問題答案。
參考文獻:
1、http://www.cnblogs.com/bbxx111/p/5461069.html
2、http://doc.qt.io/qt-5/windows-issues.html
3、https://forum.qt.io/topic/62162/qt-5-6-doesn-t-compatible-with-windows-xp/12
4、https://msdn.microsoft.com/zh-cn/library/windows/apps/dd368038.aspx
5、http://www.qtcn.org/bbs/read-htm-tid-56157.html
QT5.7.0在win10下使用visual studio 2015編譯(目標平台 xp)