• 10569阅读
  • 12回复

[原创]MinGW下静态编译、链接Qt 5.0【妈妈再也不担心插件问题了】 [复制链接]

上一主题 下一主题
离线mewjerry
 
只看楼主 倒序阅读 楼主  发表于: 2012-12-26
本文讨论的将是MinGW之上的静态编译,并且将抛开万年难伺候的QtWebkit进行编译。同时感谢Roywillow大神的指点~


一、编译Qt 5.0


与Qt 4.x不同的地方:


1、Qt 5.0比以往相比,需要有perl环境。因此要在你的环境变量中添加perl。
2、configure当中去除了一些参数,比如no-webkit,同时又添加了一些,比如icu。
3、Webkit和QtCore都需要ICU。ICU是一个处理unicode的库,如果你没有准备,webkit的编译自动跳过,core的编译使用其它方法避开ICU。
4、由于QPA的存在,与平台相关的部分被抽象成了插件,这个后面再说。
5、默认启用了ANGLE作为OpenGL和DirectX之间的桥梁,如果你没有准备ANGLE,需要额外的-opengl desktop参数
6、默认支持C++11。基于此,推荐使用支持C++11的编译器。我这里使用的是TDM的32位版本,有兴趣的可以在这里找到:http://tdm-gcc.tdragon.net/





静态编译Qt最基本的需要将gcc的几个dll变成静态链接,因为我使用了TDM,所以没有这方面的后顾之忧,如果你使用原始的gcc,是需要修改mkspecs中的make.conf的,给gcc传入参数-static-libgcc -static-libstdc++的。


同时也请注意,如果你需要一同编译debug版本,不要编译静态的。


我所使用的configure:


configure -release -static -opensource -qmake -prefix "..\qt5\qt5-x86-static" -c++11 -platform win32-g++ -qt-zlib -qt-libpng -qt-libjpeg -qt-style-windowsxp -qt-style-windowsvista -nomake tests -nomake demos -nomake examples -opengl desktop


二、静态链接


Qt 5.0重新翻修了插件部分,并且修改了部分宏的作用,以及上面提及的第4点。因此,和Qt 4.x的链接有些不同,我们需要在自己的pro当中这样写:


CONFIG+=static
static{
    QTPLUGIN+=qwindows qico
    DEFINES+=QT_PLUGIN_STATIC_LINK
    LIBS+=-L"$(QTDIR)/plugins/platforms"
    LIBS+=-L"$(QTDIR)/plugins/imageformats"
    message("Staticbuild.")
}




这里说明一下。这个qmake片段只在static时候执行。因为前面特地写了CONFIG+=static的关系,这里的static{}才得以执行。QTPLUGIN宏引入两个插件,这使得这两个库将被纳入链接;DEFINES定义了一个宏,这个宏我们需要在代码中用到;LIBS两行分别引入两个插件库的路径;最后一行是个提示语。


现在,打开main.cpp或者新建一个cpp,写入如下内容:


#ifdef QT_PLUGIN_STATIC_LINK
    #include<QtCore/QtPlugin>
    Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
    Q_IMPORT_PLUGIN(QICOPlugin)
#endif
注意,这里就是和Qt 4.x最大的不同。原有的Q_IMPORT_PLUGIN宏需要的是插件名,而从Qt5开始则变成了插件的类名。另外这里的分号是我额外加上的,不加也可以,但Qt Creator会提示有问题

2013年2月15日:从Qt 5.0.1开始,已经不需要额外的分号了。

这里面的qwindows对应的就是QWindowsIntegrationPlugin,而qico对应的则是QICOPlugin。


现在程序应该可以正常链接、运行了。





三、参考


http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/
http://www.formortals.com/how-to-statically-link-qt-4/
http://lists.qt-project.org/pipermail/releasing/2012-July/000401.html
https://bugreports.qt-project.org/browse/QTBUG-24496
https://github.com/lordmulder/LameXP/commit/255b21ab2c318f9754582eff8bc03a2eff2f4111
https://blog.qt.digia.com/blog/2012/05/08/qt-commercial-support-weekly-19-how-to-write-your-own-static-library-with-qt-2/



离线roywillow

只看该作者 1楼 发表于: 2012-12-26
给老伙计顶一个
你可以再说一下那两行LIBS是因为插件的.a所在的文件夹没有自动添加到搜索路径中去
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线roywillow

只看该作者 2楼 发表于: 2012-12-26
以及……我还是很好奇assistant之类的tools是怎么实现静态编译的……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线realfan

只看该作者 3楼 发表于: 2012-12-27
顶一下。
我也是昨天才成功完成静态编译的,折腾了好几天。MingGW的版本很重要,最后用roywillow说的rubenvb才搞定。
离线realfan

只看该作者 4楼 发表于: 2012-12-27
忍不住再回来顶一下。
楼主5.0的插件处理解决了我的困扰
离线mewjerry
只看该作者 5楼 发表于: 2012-12-27
引用第2楼roywillow于2012-12-26 23:25发表的  :
以及……我还是很好奇assistant之类的tools是怎么实现静态编译的……

它貌似自动生成了一个cpp来导入插件
离线呆呆很呆
只看该作者 6楼 发表于: 2012-12-28
MinGW静态编译QtWebkit能成功?
官方不是说QtWebkit无法支持MinGW吗?何况还是静态编译
离线roywillow

只看该作者 7楼 发表于: 2012-12-29
回 6楼(呆呆很呆) 的帖子
第一行不是说了抛开webkit了么……
况且就算webkit支持mingw了,也不可能静态链接的吧,官方明确说过webkit不再支持静态链接
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线呆呆很呆
只看该作者 8楼 发表于: 2012-12-29
回 7楼(roywillow) 的帖子
其实我也是这么认为的 但我看见了“进行编译”"抛开"几个字 读了好几遍没读懂那句话到底是啥意思 该怎么断句 于是乎...
离线mewjerry
只看该作者 9楼 发表于: 2013-02-15
更新一个细节,插件导入的宏Q_IMPORT_PLUGIN不需要额外的分号了。
离线adonais

只看该作者 10楼 发表于: 2013-02-15
回 7楼(roywillow) 的帖子
在qt5.0.1里,我用mingw静态编译webkit已经成功了.
离线roywillow

只看该作者 11楼 发表于: 2013-02-16
回 10楼(adonais) 的帖子
哈?真的?测试没问题?
vs2012动态编译webkit都各种问题搞得要死……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线adonais

只看该作者 12楼 发表于: 2013-02-16
回 11楼(roywillow) 的帖子
为了测试我把所有的例子都编译了一遍,全部通过.
我看了一下examples文件夹 14G.
静态编译生成的文件太大了,只要是静态链接webkit的程序,基本上就有50M大小.upx压缩一下要好些.
本来我是想把修改后的补丁提取出来的,后来发现改动的太多,又没有使用git的源,就放弃了.
静态编译的assistant,designer,browser
http://pan.baidu.com/share/link?shareid=260431&uk=4194566144
快速回复
限100 字节
 
上一个 下一个