Windows下静态编译Qt5


一、依赖软件

1.  显卡驱动

QtQuick2.0需要OpenGL 2.1或者更高版本的支持,而QtQuick 2.0我没有使用过,也未找到方法可以不安装。Windows的默认驱动中只支持OpenGL 1.1,并不满足Qt的需求。

Qt5的源码中包含了作为OpenGL ES2.0 API和DirectX 9之间桥梁的ANGLE,如果系统中包含了DirectXSDK(Windows SDK中包含,安装VS时会附带上),则可使用ANGLE作为OpenGL选项来编译。ANGLE是编译Qt过程中OpenGL选项的默认项。

另外也可选择自己安装的OpenGL驱动,配置Qt时将OpenGL选项修改即可。

如果使用的是VS2012,编译Qt时使用ANGLE,则会非常麻烦。VS2012默认编译出的程序是无法在XP上运行的,只有升级到VS2012 SP1后,在工程的属性页,选择配置属性-常规-平台工具集为Visual Studio 2012 – Windows XP (v110_xp)后编译出的程序才可在XP上运行。平台工具集表示的应该是编译程序所使用的库,选择v110_xp工具集,表示使用Windows SDK 7.1A,而默认情况下使用的是版本8.x。

我之前使用VS的命令行方式编译的Qt,使用Qt默认的OpenGL选项ANGLE,未指定平台工具集,一方面由于ANGLE的问题,虽然我并未使用、依赖的库也并未使用OpenGL相关函数,可工程(实际上是Qt库)仍需依赖DirectX库;另一方面,我使用的Qt是在默认平台工具集下编译的,依赖的DirectX的Windows SDK版本为8.x,而我要使我的程序可以在XP上运行,就需要将平台工具集更改为v110_xp,此时只能找到Windows SDK 7.1A,就无法找到依赖的Windows SDK 7.1中不存在的dxguid.lib、d3dcompiler.lib库了。

顺便说一句,VS2010带的Windows SDK版本为7.1。

而手工添加库文件的位置想想就是让人痛苦的工作。只好重新编译Qt,使用自行安装的OpenGL,而不是ANGLE。也可以用v110_xp编译Qt,这样仍可使用ANGLE。

另外QtWebKit还依赖ICU库。我没有使用这个模块,因此并未去了解。

2.  配置所需工具

[1]   OpenSSL,OpenSSL Toolkit需要,需为0.9.7版本以上。

[2]   ActivePerl,并添加安装目录到PATH。

[3]   Python,QtJsBackend和QtWebKit模块需要。

[4]   Ruby,QtWebKit需要。

[5]   Jom,nmake的替代选项,非必需。

[6]   安装QtWebKit模块和ANGLE的话需要将gnuwin32/bin目录加入PATH,以使用其中的Bison、GPerf和Flex。

3.  SDK及编译器

[1]   Windows SDK 7、7.1、8都可以。不过如前所述,8和ANGLE最好不要同时用了。

[2]   MinGW中g++需为4.7或以上,应该是因为需要c++ 11的新特性。之前用MinGW编译Qt4.8,无法做到完全的静态链接,仍需依赖libgcc,可能是配置有误。下载了静态编译版的MinGW(QP MinGW)后可做到完全静态编译,可惜该版本的MinGW最新版中gcc也只为4.4.5。

参考

General QtRequirements

Qt forWindows Requirements

Qt 5 onWindows ANGLE and OpenGL

VisualStudio 2012 Update 1

二、安装过程

1.  安装许可证

商业版需要,开源版不需要。

2.  解压源文件

解压至心仪目录,我解压到了D:\Qt_static。

3.  修改链接选项

需将qtbase/mkspecs/win32-msvc2012/qmake.conf(不同VS版本选择的目录不同)中的链接选项-MD和-MDd改为-MT和-MTd,以使用Windows的静态库。即将

27:QMAKE_CFLAGS_RELEASE    = -O2 -MD

28:QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO +=-O2 -MD -Zi

29:QMAKE_CFLAGS_DEBUG      = -Zi -MDd

改为

27:QMAKE_CFLAGS_RELEASE    = -O2 -MT

28:QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO +=-O2 -MT -Zi

29:QMAKE_CFLAGS_DEBUG      = -Zi -MTd

如果未改此项,最后编译工程时,指定链接选项为MT,则会与依赖的Qt库产生冲突。

MinGW中需将qtbase/mkspecs/win32-g++/qmake.conf中的链接选项由改为-static。即将

69: QMAKE_LFLAGS            =

76: QMAKE_LFLAGS_DLL        = -shared

改为

69: QMAKE_LFLAGS            = -static

76: QMAKE_LFLAGS_DLL        = -static

4.  设置环境变量

最好使用VS自带的命令行工具内编译,以免环境变量之前被污染过。官方称还需将qtbase\bin、qtrepotools\bin(源文件目录下无此目录)、gnuwin32\bin(QtWebKit、ANGLE依赖)加入PATH,但我没加,没出问题。

5.  构建Qt库

Qt使用的是最常见的configure、make、make install三部曲。

configure

Configure选项很多,可以用如下方式将选项输出到文件查看。

D:\Qt_static\qt-everywhere-opensource-src-5.1.1\>configure–help > tmp.txt

我使用的configure选项如下:

-prefix D:\Qt_static\5.1.1-VS2012 -confirm-license-opensource -platform win32-msvc2012 -release -static -qt-zlib -qt-libpng -qt-libjpeg-qt-freetype -no-qml-debug -c++11 -nomake tests -nomake examples -no-angle -opengldesktop -no-compile-examples -skip activeqt -skip declarative -skip doc -skip graphicaleffects-skip jsbackend -skip multimedia -skip quick1 -skip quickcontrols -skip script -skipsensors -skip serialport -skip svg -skip tools -skip translations -skip webkit -skipwebkit-examples -skip x11extras -skip xmlpatterns

其中-prefix指定编译后的二进制文件所处的目录,默认是qtbase目录。指定另外的目录可以在二进制文件生成后删除不再使用的源码和中间文件。删除中间文件也可通过nmake clean来实现,但该方法太慢了。同时因为我这里静态链接的Qt只用于最后的发布,因此Qt的源码我也不需要,和中间文件一起删除非常方便。

-confirm-license用于确认同意许可证,省得进入程序后再和configure程序交互。Qt开源版好像是可以选择GPL还是LGPL授权,具体的不太清楚。

-opensource 用于指明使用的是开源版本。

-platform win32-msvc2012指定使用的是VS2012,其他版本的编译器需要指定其他选项。

-release –static用于指明编译的Qt是静态链接的发布版。

-qt-zlib –qt-libpng –qt-libjpeg –qt-freetype用于指定qt使用的第三方库,静态编译版本貌似需要手工指定。

-no-qml-debug用于关闭qml的调试功能。qml和Qt Quick我都用不上,安装了白白占空间。

-c++11用于支持c++11特性。VS2012下该选项是必选的,无需手工键入。

-nomake tests –nomake examples -no-compile-examples用于阻止测试和例子的编译,编译例子尤其占用时间空间。

-no-angle –opengl desktop用于使Qt使用桌面版即自行安装的OpenGL,而不是ANGLE作桥梁的DirectX。

-skip后为Qt的模块,表示不构建Qt的该模块。模块名即为源码目录下的各个子目录名称,加不加起首的qt都可以。我只需要qtbase和qtimageformats,因此skip掉了其他所有模块。实际上也可以在make的时候构建指定的模块。

configure最后会输出Qt的配置信息,有时会提示configure出错或有问题可能导致nmake(MinGW为make或mingw32-make)不成功,这时就需要检查一下了。如果出错或需修改配置信息,可以键入nmake distclean来清空上次的configure配置。(configure在这里好像有个BUG:configure最后会提示可以键入nmake confclean来清空配置信息,可实际上Makefile里就没有confclean,只有distclean)不过这种clean方式也相当慢,不如删掉目录,重新解压来的快而且干净。

nmake

configure成功后,即可键入nmake来编译Qt,按上面的配置,编译的东西不多,好像只需要1个多小时,具体时间记不得了。

nmake也可指定需要构建的模块,譬如只需要构建imageformats模块,只需键入nmakemoduleimageformats。

也可用jom替代nmake。

nmake install

nmake完成后,之前configure指定的prefix目录中,依然什么都没有。键入namke install会将生成的二进制文件复制到prefix目录。

 

这样就可以用Qt5来编写可以在XP上运行的无需依赖库的可执行程序了。

 

参考

Installing Qtfor Windows

/MD、/MT、/LD(使用运行库)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值