windows 下 QT 5.6 静态编译

请遵守LGPL协议。

编译准备:

visual studio 2010

QT5.6.1 source code

google Angle source code

DirectX SDK

编译的电脑显卡比较老Opengl版本升不上去,所以使用angle(google的opengle es转到directX9d).

1.编译angle,使用visual studio 2010编译,因为google使用vs2017了,使用vs2010编译最新代码还是比较麻烦的,所以选一个历史分支,这个编译比较顺利注意点就是配置DXSDK的路径。

2.编译QT5.6.1代码,查看config的帮助:configure.bat -h。 查看了一下帮助就选择了一下自己需要东西:configure.bat  -prefix "E:\program_file
s\qt_5_6_1\5.6\Src\ouput" -extprefix "E:\program_files\qt_5_6_1\5.6\Src\ouputext
" -debug-and-release -platform win32-msvc2010 -force-debug-info -static -static-
runtime -no-compile-examples -accessibility -opengl es2 -opensource -make libs -
angle -nomake examples -nomake tests -no-openssl

就开始编译了,遇到第一个坑就是“gui/opengl/qopengl.h(97):fatal error C1083: 无法打开包括文件:“GLES2/gl2.h”: No such file or directory” 这时-opengl选项不论选择什么:desktop,dynamic,OpenGL,es2都会报这个错误。因为我需要使用es2选择的是es2,解决的办法:qtbase\src\3rdparty\angle\include下面的文件夹复制到qtbase\include目录,继续编译(载自:https://blog.****.net/mabing993/article/details/62230238)或者configure时用configure  -I <includepath>参数指定angle的include目录,因为是静态库没有涉及到链接基本会成功。

3.把编译的qt qmake等配置到 Qt到vs2010的add-in。打开vs2010菜单的Qt项下的Qt optionstian添加编译出的Qt路径,我这里出现这个错误:windows 下 QT 5.6 静态编译一感觉是Add-in版本太老了,就去Qt网站下载了一个适用vs2010最新的版本就可以正常添加了。

5.编译已经存在Qt工程。因为不是新建的工程,直接编译现有的工程有些lib不会自动更新成编译出来的lib,这是需要自己添加到工程依赖的lib,Qt不像boost那样编译时依赖哪些lib会提示出来,Qt是直接报错很多未知符号的错误,这个篇blog给了很大帮助:

https://blog.****.net/zc881124/article/details/37695879

但是最后一个链接失败找了很多资料没有解决:unresolved external symbol QWindowsEGLStaticContext * __cdecl QWindowsEGLStaticContext::create。于是只能自己解决了,在源码里找到QWindowsEGLStaticContext::create的定义在qwindowseglcontext.cpp里面,找到同级目录下的debug目录下没有qwindowseglcontext.obj文件,这下可以判断是这个cpp没有编译,打开原始的makefile文件里面包含的全是pri文件,打开本路径下的pri文件,的确有一个判断:contains(QT_CONFIG, opengles2) {
    SOURCES += $$PWD/qwindowseglcontext.cpp
    HEADERS += $$PWD/qwindowseglcontext.h
} else: contains(QT_CONFIG,opengl) {
    SOURCES += $$PWD/qwindowsglcontext.cpp
    HEADERS += $$PWD/qwindowsglcontext.h
}

感觉是config的有问题,我明明就是opengles2 既然还是没有编译,就是这个判断写死后nmake makefile,nmake install,编译出来qwindows.lib, 回到自己的vs工程编译一下都过了。