转自:https://blog.youkuaiyun.com/hulingerlin/article/details/81914279
参照该博客基础上,添加一些自己编译中遇到的问题与解决情况。
1.编译的前的基础了解
目标platforms(平台),编译静态库或者动态库,skip某个功能模块等选项
2.源码下载
1.直接下载,下载地址:http://download.qt.io/archive/qt/
选择含有everywhere-src的版本即为qt源码版本,我此处下载的是:qt-everywhere-src-5.12.3.zip
2.编译工具安装
(1)下载安装visual studio 2015
(2)安装ActivePerl:https://www.activestate.com/activeperl,安装并设置PATH,我安装的是 ActivePerl-5.26.1.2601-MSWin32-x64-404865.exe
ActivePerl一个perl脚本解释器。其包含了包括有 Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套开发工具程序,可以让用户编写出适用于unix,windows,linux系统的CGI程序来。安装的只是perl的一个解释程序啦,外观上也不会发生什么变化,你在windows的cmd界面里输入perl -v可查看你所安装的版本。在你编译perl程序时会用到它。若要编写perl程序需借助其它工具:notepad,eclipse.vim,eclim……用这些编写工具写好后存储成perl格式,就可用activeperl去编译喽!
CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、VB 和Delphi 等。CGI 分为标准CGI 和间接CGI两种。标准CGI 使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。间接CGI 又称缓冲CGI,在CGI 程序和CGI 接口之间插入一个缓冲程序,缓冲程序与CGI 接口间用标准输入输出进行通信。
- 环境变量中path已经添加了activeperl的路径
(3)安装Python,推荐使用Python 2.x版本,因为Python 3.x与Python 2.x在一些方法上有改动, 例如print方法 ,Qt使用的 是Python 2.x的API,下载地址:https://www.python.org/downloads/,安装并设置PATH。
3.配置编译选项
在开始菜单里进入Visual Studio 2015文件夹,打开“VS2015 x86本机工具人员命令提示符”,进入cmd窗口模式:1.cd 下载的Qt源码目录;2.执行configure -prefix E:\\Qt5.12.3_src\build -release -opensource -share -force-debug-info -opengl dynamic -platform win32-msvc -c++std c++11 -skip qtmultimedia -skip qtsensors -skip qtwebengine -skip qtgamepad -nomake examples -nomake tests -mp -skip qtlocation -skip qtserialbus -skip qtconnectivity -confirm-license命令配置编译选项,下面就对这些参数做简要的说明。
4.configure参数说明
-prefix 生成目标库的目录
-release 生成release版本 -debug 生成debug版本 -debug-and-release生成debug和release版本
-opensource 编译开源版 -commercial 编译商业版 (参数可选)
-static 生成静态库lib文件 -shared 生成动态库dll文件 (参数可选,默认是shared)/*** 注:静态库与动态库区别是在生成目标文件的链接方式上,静态库采用静态链接,在生成的目标文件(如.exe文件)中会包含库文件代码,而动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。***/
-force-debug-info 强制生成调试信息 (参数可选)/*** 这个参数是让Qt release版本也生成.pdb文件。这个文件有什么作用呢?它就是我们在release版本下设置了异常捕获信息函数,打印出错堆栈信息所必须的文件。如果程序没用开启异常捕获选项,是不需要开启这个参数的。***/
-opengl dynamic 指定opengl库 (参数可选) /*** 关于这个参数说明请参考doc.qt.io/qt-5/windows-requirements.html ***/
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
-platform win32-msvc 目标库运行平台
-skip 跳过该模块
-nomake 不编译该模块
-mp 启动多核编译
注:-skip和-nomake都可省略,但是-skip qtwebengine这个参数不能省略,qtwebengine模块有需要依赖的库,这里不跳过编译会失败。
5.make && make install
等待configure命名执行完成后,输入nmake开始编译,如果结果没有错误,输入nmake install等待结束,完成。
问题:输入nmake编译,提示Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isn't set
解决办法:进入Qt源码目录D:\qt-everywhere-src-5.12.3\qtbase\mkspecs\common找到msvc-version.conf
在其中输入QMAKE_MSC_VER = 1900,保存
重新在cmd窗口输入nmake,可以编了,等编译完。
问题:在nmake一段时间后(大概是2-3个小时后),出现了一段错误,显示的全是windows com相关错误。但仔细看编译的相关文件,名字含有qbluetooth, 应该是蓝牙相关的,因平时不需要使用到蓝牙相关功能,故在configure配置时将蓝牙模块去掉
解决方法:使用configure的-skip选项可以排除Qt模块,一般情况下模块名就是源码目录中对应的子目录名。有些子目录会包含多个模块,比如说qtconnectivity目录就包含了Qt NFC模块和Qt Bluetooth模块,排除这两个模块需要将-skip qtconnectivity作为配置参数
(源自:https://www.cnblogs.com/findumars/p/6254629.html)故将configure命令添加上-skip qtconnectivity,在命令行再次配置完后,无错,再次输入nmake,编译成功,没再出现以上错误。输入nmake install安装,等待结束。
注:Qt源码要成功编译注意以下因素:1.检查编译Qt的必须工具是否正确安装,并检查PATH值是否正确。2.启动vs 2015那个命令窗口,而不是普通的那个cmd窗口。3.-skip qtwebengine参数一定不能省略,否则编译会失败。
参考资料:
1.Qt编译官方文档:http://doc.qt.io/qt-5/build-sources.html
2.configure参数详细说明:http://www.cnblogs.com/elect-fans/archive/2012/03/28/2420647.html
3.Qt源码编译:http://blog.youkuaiyun.com/xiaoxiaoyusheng2012/article/details/45196879
4.msvc2015 编译Qt源码https://blog.youkuaiyun.com/u012361112/article/details/78982257