最近在学习QT,QT的优点不必说了。但是也存在一些弊端,最头疼的就是库的编译,生成exe文件,必须要将其一用的dll文件拷贝到同一个目录下,本人深受其苦,所以上网查了一些资料,方知QT也可以编译静态库,以下内容为转载,帮了我的大忙,所以贴出来,希望能帮到更多的人。。
1.首先下载源码(版本:5.2.1):
http://download.qt-project.org/official_releases/qt/5.2/5.2.1/single/qt-everywhere-opensource-src-5.2.1.zip
解压到目录qt-everywhere-opensource-src-5.2.1\
2.更改VC运行库的配置:
VS2012对应的配置文件是:qt-everywhere-opensource-src-5.2.1\qtbase\mkspecs\win32-msvc2012\qmake.conf
把MD改为 MT,
MDd改为MTd,共三处:
QMAKE_CFLAGS_RELEASE
= -O2
-MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2
-MT -Zi
QMAKE_CFLAGS_DEBUG
= -Zi
-MTd
3.建立一个批处理文件:
比如建立一个文件名为vs2012.build.bat的bat文件,放到目录qt-everywhere-opensource-src-5.2.1下面,然后进行编辑,内容如下:
configure-confirm-license -opensource -platform win32-msvc2012 -vcproj-debug-and-release -static -prefix "D:\Qt\5.2.1-static" -no-opengl-qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -no-angle -nomaketests -no-compile-examples
4.运行vs2012.build.bat:
首先必须要运行VS2012的批处理文件(安装后会有这个快捷方式):VS2012 x86 Native Tools CommandPrompt.bat,这样就打开了一个控制台窗口,CD到目录qt-everywhere-opensource-src-5.2.1,再运行vs2012.build.bat,完成后检查是否成功,成功后就继续下一步.
5.开始编译:
编译只要执行 nmake即可,这是一个漫长的过程,................,不出意外最后没有任何错误的结束了。
6.安装:
上述编译成功后,只要执行 nmakeinstall就会把最终的bin/lib/include等等相关的文件复制到我们之前配置的目录
D:\Qt\5.2.1-static,至此静态库编译就全部完成了,庆祝一下吧!
7.安装和配置QT VS Add-in:
但不要高兴的太早,我们必须得建立一个测试程序运行起来才算成功,有一个VS2012的插件是必须要安装的,那就是Qt VS Add-in,我下载的是最新的:
http://download.qt-project.org/development_releases/vsaddin/qt-vs-addin-opensource-1.2.3-alpha.exe,安装完成后运行VS2012,会多一个"Qt5"的菜单,运行"Qt Options"
增加新的QT版本配置:
Ok后配置就完成了。
8.建立QT Project进行测试,这一步很关键:
创建一个qttest的QT应用程序,开始编译,啊,居然编译不通过!当然不会通过,因为我们编译的QT5.2.1的VC运行库是MT和MTd,工程向导创建的缺省是MD和MDd,那就改一下吧,Debug版本改为:Multi-threadedDebug (/MTd),这下编译终于通过了,再次
,离成功又近了一步,那就赶紧Run吧,然后居然弹出一个Assert窗口
。
当然和大家一样肯定是去google错误了,获取的信息是:插件无法加载,毕竟我们现在是staticlibrary,当然无法加载 dll了,好在官方给出了staitc library加载plugin的办法:使用宏
Q_IMPORT_PLUGIN,在main.cpp中增加代码如下:
#include < QtPlugin >
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugi
n)
至于为什么是QWindowsIntegrationPlugi
n这个名字,在网上搜索了很久都没找到,最后我是在qwindows.lib中搜索到的.
继续编译,报错unresolvedexternal symbol "struct QStaticPlugin const __cdeclqt_static_plugin_QWindowsIntegrationPlugi
n(void),这个简单,增加lib path:
$(QTDIR)\plugins\platforms,然后增加qwindowsd.lib(Release是qwindows.lib).
再进行编译,又link出错:
qwindowsd.lib(qwindowsintegration.obj) : error LNK2001:unresolved external symbol "public: virtual void __thiscallQBasicFontDatabase::populateFontDatabase(void)
那肯定是有依赖的lib没增加,最后找到了需要再手动增加
Qt5PlatformSupportd.lib(同样Release是Qt5PlatformSupport.lib),最终QTlib文件有这样几个文件:
Qt5Cored.lib
Qt5Guid.lib
Qt5Widgetsd.lib
qwindowsd.lib
Qt5PlatformSupportd.lib
这下终于编译通过并运行成功了!这下可以庆祝了。