QT5.7.0在win10下使用visual studio 2015編譯(目標平臺 xp)

環境: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

相關文章
相關標籤/搜索