欢迎转载,但转载请全文转载、注明出处并附上本文链接
http://blog.csdn.net/phil2036/article/details/20409535
工作联系:[email protected] 上海 Mr.张(就是本人 )
漫长及伴随各种错误的编译过程
网上能找到的基本都是关于Qt4编译的文章,Qt5的无论中文或是英文都不多,所以记录一下
请原谅博主的渣排版,博主一是懒二是真不会,其实博主连WORD都玩不转
一、源码及IDE
这篇文章讲的主要是用VS2008来编译Qt5这个库。Qt从4.85升级到5.0以后就不再提供VS2008的自动安装文件了。所以如果你和我一样还在用着VS2008或者2005,那么你就需要自己动手来编译这个库。当然你要是用VS2010或者更新的版本,但是你跟我一样喜欢自己编译这些开源库来用而不是直接用现成的,那么这篇文章大概也能作为参考。
这篇文章用到的源码是Qt 5.2.1,可以从qt-project.org下载,请注意,我们在WINDOWS环境下,所以请下载.zip包,下载完成的zip包文件名为qt-everywhere-opensource-src-5.2.1。然后您需要把他解压到工作文件夹中,我这里是D:\tools\common\Qt\qt-everywhere-opensource-src-5.2.1\。下文中我将用%QT_SRC_DIR%来指代这个文件夹。
然后我这里用到的VS版本是VS2008 SP1。需要注意的是,一会我们用到的是他的命令提示行工具,您可以在您的开始菜单中的Microsoft Visual Studio 2008->Visual Studio Tools中找到这些命令行提示工具,这里其实是一组工具,我解释一下其中可能用到的三个工具:
1.Visual Studio 2008命令提示行工具: 这个工具是提供在32/64位计算机上编译32位程序的环境;
2.Visual Studio 2008 x64兼容工具命令提示: 这个工具提供在32/64位计算机上编译64位程序的环境;
3.Visual Studio 2008 x64 Win64工具命令提示:这个工具提供在64位计算机上编译64位程序的环境;
具体的内容可以参考MSDN上的这篇文章:http://msdn.microsoft.com/zh-cn/library/x4d2c09s(v=vs.110).aspx
我这边要生成一个32位的Qt 5.21,所以选择了工具1。
最后我电脑的操作系统是Windows 7 SP1 64bit旗舰版
二、编译环境的配置
1.需要安装的一些辅助程序
这个部分在以前的Qt4当中是没有遇到过的,这次Qt5的configure.exe需要一些脚本语言来进行执行,所以我们这边需要配置两个脚本语言的执行环境。这个也是Qt5编译过程中碰到的错误最多的原因之一。这边一共需要配置两个环境:Perl和Python。
a.Perl环境的配置
按照Qt官方文档的说明,Perl需要5.8以上的版本(源码包中的ReadMe文件请仔细阅读)。于是去perl.org下载ActiveState Perl即可,最新版本是5.16.3。这里直接就下载MSI安装包,下过来之后就一路默认参数安装。Perl环境就相对简单,安装包会自动把Perl的执行路径加到Path环境变量当中。
最后,保险起见测试一下Perl环境,随便打开一个cmd窗口,输入perl不报错就可以了,按ctrl+c退出。
b.Python环境的配置
Python需要2.7以上的版本。所以去python.org下载安装包,最新版本是2.7.6。注意,不要下那个3.x的版本,据我了解python的2.x和3.x是两个并行的版本发展路径。还是一路默认安装,安装完后python这里比较复杂,需要手动把python的执行环境加到path环境变量中。默认安装的话就是把C:\Python27这个路径加到Path环境变量中。
最后还是测试一下python环境,重新打开一个cmd窗口,输入python敲回车后不报错出现python的>>>输入提示符就说明没问题了,按下ctrl+z然后敲回车就可以退出了。
2.系统环境变量的配置
辅助环境我们已经安装配置完成了,接下去我们要检查一下操作系统的环境变量,主要是检查path这个变量,要检查的是下面几个东西:
a.检查Perl和Python路径在path变量中的设置,没有就按照上文的加上去;
b.如果你有安装或者配置了以前版本的Qt,那么在path里先临时取消掉,编译完再添加;
3.BUG的修补(这个针对VS2008及以下版本,高版本VS请忽略)
我在用VS2008编译QT5源码时碰到了这么个问题,编译到qtwinextras模块时,遇到一个THUMBBUTTON类型转换错误以及THBN_CLICK宏未定义错误。具体的错误信息如下:
cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MDd -MP -GR -W3 -w34100 -w34189 -D UNICODE -DWIN32 -DQT_BUILD_WINEXTRAS_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED _WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x040800 -D_USE_MATH_DEFINES -DNTDDI_VE RSION=0x06010000 -D_WIN32_WINNT=0x0601 -DQT_NO_EXCEPTIONS -DQT_GUI_LIB -DQT_CORE _LIB -I"C:\qt5test\qt5\qtbase\include" -I"C:\qt5test\qt5\qtbase\include\QtWinExt ras" -I"C:\qt5test\qt5\qtbase\include\QtWinExtras\5.2.0" -I"C:\qt5test\qt5\qtbas e\include\QtWinExtras\5.2.0\QtWinExtras" -I"tmp" -I"C:\qt5test\qt5\qtbase\includ e\QtGui" -I"C:\qt5test\qt5\qtbase\include\QtCore" -I".moc\debug" -I"C:\qt5test\q t5\qtbase\mkspecs\win32-msvc2008" -Fo.obj\debug\ @C:\Users\aclight\AppData\Local \Temp\moc_qwintaskbarprogress.obj.6880.1934.jom moc_qwintaskbarprogress.cpp
qwinthumbnailtoolbar.cpp(257) : error C2664: 'ITaskbarList3::ThumbBarAddButtons' : cannot convert parameter 3 from 'THUMBBUTTON [7]' to 'THUMBBUTTON' No constructor could take the source type, or constructor overload resol ution was ambiguous
qwinthumbnailtoolbar.cpp(322) : error C2065: 'THBN_CLICKED' : undeclared identif ier
qwinthumbnailtoolbar.cpp(347) : error C2676: binary '|=' : 'THUMBBUTTONFLAGS' do es not define this operator or a conversion to a type acceptable to the predefin ed operator
qwinthumbnailtoolbar.cpp(349) : error C2676: binary '|=' : 'THUMBBUTTONFLAGS' do es not define this operator or a conversion to a type acceptable to the predefin ed operator
qwinthumbnailtoolbar.cpp(351) : error C2676: binary '|=' : 'THUMBBUTTONFLAGS' do es not define this operator or a conversion to a type acceptable to the predefin ed operator
qwinthumbnailtoolbar.cpp(353) : error C2676: binary '|=' : 'THUMBBUTTONFLAGS' do es not define this operator or a conversion to a type acceptable to the predefin ed operator
qwinthumbnailtoolbar.cpp(355) : error C2676: binary '|=' : 'THUMBBUTTONFLAGS' do es not define this operator or a conversion to a type acceptable to the predefin ed operator
qwinthumbnailtoolbar.cpp(357) : error C2676: binary '|=' : 'THUMBBUTTONFLAGS' do es not define this operator or a conversion to a type acceptable to the predefin ed operator
qwinthumbnailtoolbar.cpp(364) : error C2676: binary '|=' : 'THUMBBUTTONMASK' doe s not define this operator or a conversion to a type acceptable to the predefine d operator
qwinthumbnailtoolbar.cpp(366) : error C2676: binary '|=' : 'THUMBBUTTONMASK' doe s not define this operator or a conversion to a type acceptable to the predefine d operator
qwinthumbnailtoolbar.cpp(368) : error C2676: binary '|=' : 'THUMBBUTTONMASK' doe s not define this operator or a conversion to a type acceptable to the predefine d operator
查了一下google发现这是一个在VS2008环境下(估计VS2005也会出现)的一个编号为QTBUG-35980的BUG,可以参考官方的这个bug report
https://bugreports.qt-project.org/browse/QTBUG-35980
官方有一个patch可以解决这个BUG:https://codereview.qt-project.org/#change,75844
因为官方这个patch需要分开下载三个文件,我把它下载过来重新打包上传到了CSDN,可以点击这里下载。下载后解压,并且把2个.CPP和1个.H文件放到%QT_SRC_DIR%\qtwinextras\src\winextras\下覆盖掉原来的文件即可。
4.webkit的处理
在以前编译Qt4的时候一般会跳过webkit这个东西,因为编译这个东西很耗时而且基本没用。以前用的手段是执行configure时使用-no-webkit参数,但是在Qt5当中这个参数被移除掉了。不过想要跳过这个东西还是很简单,在执行configure之前,把源码包下面的qtwebkit\和qtwebkit-examples直接删掉或者改名就可以了,我这边是直接删掉了。
注意:
所有path环境变量添加以后一定要重新开一个cmd窗口测试一下是否正确,因为好多问题都是这边配置错误所导致的,编译一个Qt很花时间,所以还是认真做好准备工作为好。
到这里所有的环境配置和辅助工具安装已经结束了,下面进入到正式的编译过程。
三、编译Qt
1.执行Visual Studio 2008命令行工具及配置临时环境变量
首先,我们需要打开Visual Studio Tools快捷菜单下的Visual Studio 命令提示工具,实际就是运行Microsoft Visual Studio 9.0\VC\vcvarsall.bat这个批处理文件。执行这个批处理文件而非普通的Command Line主要是为了加载VS编译所需要的一些环境。
前面做准备工作的时候设置了两个脚本语言的执行环境。现在我们还要临时增加几个路径到系统环境变量path当中。这里增加的几个路径只对当前的Command Line有效,退出之后就会消失。主要是这么几个:
%QT_SRC_DIR%\qtbase\bin
%QT_SRC_DIR%\qtrepotools\bin
%QT_SRC_DIR%\gnuwin32\bin
操作过程要用到set命令。首先需要把当前目录使用cd设置到当前%QT_SRC_DIR%这个路径下,然后使用下面的命令来设置
set path=%cd%\qtbase\bin;%cd%\qtrepotools\bin;%cd%\gnuwin32\bin;%PATH%
设置完成后记得使用echo %PATH%这个命令来检查一下。我这里是这样设置的
2.执行configure配置编译选项
接下去照例是要用configure批处理文件来进行配置,敲入以下的命令:
configure -mp -platform win32-msvc2008 -opensource -prefix %cd%\qtbase -developer-build -opengl desktop -nomake tests -nomake examples -qt-zlib -qt-libpng -qt-libjpeg
几个选项的说明:
-mp 编译时开启编译器对多核心/多线程处理器的支持,这个可以有效加快编译的速度
-platform 设置当前的编译环境,VS20xx就是win32-msvc20xx
-opensource 表示遵守LGPL开源协议,使用这个参数后后面可以少一个确认
-develop-build 这个是QT5里面新加的一个参数,按照官方文档的讲法,他会比以前使用的-debug-and-release生成的debug版本里有更多的调试信息,所以就用这个
-opengl 这也是QT5新添加的参数,这次QtQuick需要GPU硬件加速,支持了OpenGL 2.1/ES2以及采用ANGLE库将OPENGL调用转换为DirectX方式调用,使用这个参数需要指定采用的OpenGL版本,我们编译的库是用在PC上的,所以采用-opengl desktop这个参数
-angle-d3d11 采用angle库来将QpenGL的调用转换为DirectX的调用,使用这个参数需要系统中安装有DirectX SDK,并且要指定ANGLE库的位置
-nomake tests 不编译测试用例
-nomake examples 不编译demo。这是个比较奇怪的参数,官方推荐加,但是我测试下来加不加没什么区别,都不会像以往版本一样生成qtdemo.exe,加了之后还会在编译中产生一个错误(这个错误的说明及解决我写在下面的FAQ当中),这个版本的example是需要自己用QtCreate打开并编译的。
-prefix 似乎是转向到后面参数指定的路径,不是很清楚,官方文档推荐这么做就这么做了,不做好像也没问题
-I 增加额外需要包含头文件的路径
-L 增加额外需要引入lib文件的路径
-I和-L这两个开关主要是用在增加一些额外插件比如plugin-sql-mysql编译时使用的。
我导出了一个完整的参数说明文档并上传到CSDN,点击这里可以下载
执行完configure命令后,会有一个协议确认,然后自动配置脚本开始配置,这个配置过程比Qt4会快很多,大概一分钟左右就好了。然后就可以开始编译了
3.编译
编译这个比较简单输入nmake命令就可以开始编译,然后就是漫长的等待,看个美剧或者干脆去睡觉都可以(推荐可以看看Grey‘s Anatomy或者House of Cards),根据配置不同大概花费2-4小时(我的AMD 9550花了两小时,Thinkpad X61就丧心病狂地要花4个多小时T.T)。编译完成后注意检查一下输出,没有错误就基本完成了。
4关于文档和assistant(为什么我的assistant是空的)
这个版本是不会自动生成参考文档,这个时候运行assistant你会看到除了他自己本身的一个说明文档就一片空白。这时候就需要再执行nmake docs,然后又要等半个小时左右就完成了,这时候打开assistant其他的文档就全部出现了。
4.清理
如果需要清理的话,可以执行nmake clean。配置方面,执行configure -redo可以回滚到上一个配置文件,想要删除配置暂时没有办法,但是可以用新的配置参数来覆盖原有的。
四、FAQ
Q:为什么编译器一直抱怨找不到opengl2.h/一直要找GLES下的头文件,我已经设置了-opengl desktop参数/-opengl desktop参数似乎不起作用
A:这个问题我一开始也碰到过,基本上就是要么没装Perl和Python环境,要么就是装了python环境但是忘记把python的路径加到path变量。试试看在cmd里执行perl和python会不会出错。
Q:error C2664:cannot convert parameter 3 from 'THUMBBUTTON [7]' to 'THUMBBUTTON' 或者 error C2065: 'THBN_CLICKED' : undeclared identifier
A:VS2008环境的一个BUG(QTBUG-35980),解决方案在上面,自己找找。
Q:编译过程中rcc崩溃,抱怨找不到platforms下的qminimal.dll、qoffscreen.dll和qwindows.dll
A:应该是没有用-nomake examples参数,按几次终止也能继续编译,但是输出的东西是不是缺什么就不知道了。或者就在Command Line窗口按下Ctrl+C先终止,然后用set命令把%QT_SRC_DIR%下的qtbase\plugins\platforms路径加到PATH变量下,然后继续nmake。推荐的还是采用官方的-nomake examples这个参数。
Q:assistant下的文档去哪了?assistant为什么是空的
A:你需要执行nmake docs来编译文档,执行完毕就有了
Q:qtdemo去哪了?
A:很遗憾,QT5还就真没这个东西。想要看demo?装个QtCreate去看,demo都在%QT_SRC_DIR%\qtbase\examples里面,需要自己编译。
最后放个福利:点我下载懒人包,把下载过来的批处理文件放源代码根目录下,按照本文第一部分设置好脚本环境,然后用VS的命令行定位到根目录,执行这个批处理文件,完成以后nmake/nmake docs,即可无痛编译。
最后的最后Qt到底是读成cute还是Q.T.?