環境:win10+vs2015+QT5.7.0html
目標:編譯出能在windows xp上運行的QTpython
經過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的論壇經驗編譯成功。git
最後的編譯方法以下:sql
修改%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.01 QTDIR是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" x86 REM ********** 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.0 SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH% REM Uncomment the below line when using a git checkout of the source repository REM SET PATH=%_ROOT%\qtrepotools\bin;%PATH% SET QMAKESPEC=win32-msvc2015 set _ROOT= REM Generate makefile configure.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。windows
上面的方法可能存在冗餘的東西,項目追得緊,先解決項目後再來仔細推敲和完善。ruby
對於這個方法須要說明的2點:app
一、vs2012以後須要編譯能在xp上運行的程序必須且只能定義宏_USING_V110_SDK71_,有些人會說V110不是要跟着vs的版本走嗎?若是你去嘗試解決__useHeader宏重定義時就會發現,vs2015裏的頭文件裏面判斷的也是_USING_V110_SDK71_。字體
二、configure配置腳本里面關鍵點是-target xp和-no-directwrite,第一個是配置目標平臺爲xp,第二個是windows字體渲染的方式。傳送口在這裏:https://msdn.microsoft.com/zh-cn/library/windows/apps/dd368038.aspx,文中明確指出directwrite必須windows 7以上的平臺。ui
directwrite的配置要感謝https://forum.qt.io/topic/62162/qt-5-6-doesn-t-compatible-with-windows-xp/12的問題答案。spa
參考文獻:
一、http://www.cnblogs.com/bbxx111/p/5461069.html
二、http://doc.qt.io/qt-5/windows-issues.html
三、https://forum.qt.io/topic/62162/qt-5-6-doesn-t-compatible-with-windows-xp/12
四、https://msdn.microsoft.com/zh-cn/library/windows/apps/dd368038.aspx
五、http://www.qtcn.org/bbs/read-htm-tid-56157.html