Qt项目发布的exe程序,默认是以动态链接形式的,这样发布后的程序会附带好多Qt自己的dll库,这样文件数量不仅多,而且移植到其他电脑上的时候,还可能会遇到,提示缺其他库等各种运行不起来的情况。当然办法还是有的,找到所有用到的库一块随着exe发布就可以了。其实还有一种方法就是用静态编译发布程序。
 
 
        下面是静态编译的流程。
 
文件准备
        1、安装VS2013
        2、安装python2.7,并设置环境变量
        3、下载Qt5.4.2源码文件,名字为 qt-everywhere-opensource-src-5.4.2.zip
        4、下载icu,可到 http://www.npcglib.org/~stathis/blog/precompiled-icu/ 去下载别人已经编译好的icu
 lib库
        5、下载openssl,去官网下载最新版即可
 
 
    在D盘下新建文件夹 qt-static-build 
    将Qt源码解压到 D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2 
    将icu解压到 D:\qt-static-build\icu 
    将openssl解压到 D:\qt-static-build\openssl-0.9.8zh ,openssl需要编译,可以参考 http://www.godebug.org/index.php/archives/104/ 将编译后生成的ssl文件夹放到 D:\qt-static-build\ssl 
 
 
文件修改
        6、找到F:\Qt\qt-everywhere-opensource-src-5.4.2\qtbase\mkspecs\win32-msvc2013\qmake.conf 文件,将原来的
QMAKE_CFLAGS_RELEASE = -O2 -MD -Zc:strictStrings
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi -Zc:strictStrings
QMAKE_CFLAGS_DEBUG = -Zi -MDd
改为
QMAKE_CFLAGS_RELEASE = -O2 -MT -Zc:strictStrings
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi -Zc:strictStrings
QMAKE_CFLAGS_DEBUG = -Zi -MTd
就是要将MD编译模式给为MT编译模式。
 
开始命令操作
        7、找到开始菜单 所有程序->Visual Studio 2013->Visual Studio Tools->VS2013 开发人员命令提示,打开“VS2013 开发人员命令提示”。
        8、输入命令:cd D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2,输入命令:F:
        9、输入命令:
set PATH=C:\Windows;C:\Windows\System32;C:\Ruby22\bin;C:\Python27;C:\Python27\Scripts;D:\qt-static-build\icu\lib;D:\qt-static-build\icu\bin;D:\qt-static-build\gles_sdk\x86;C:\Perl\bin;D:\qt-static-build\ssl\bin;
set INCLUDE=D:\qt-static-build\icu\include;D:\qt-static-build\gles_sdk\include;D:\qt-static-build\ssl\include;
set LIB=D:\qt-static-build\icu\lib;D:\qt-static-build\gles_sdk\x86;D:\qt-static-build\ssl\lib;
"D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
        10、执行configure命令,输入:
configure -confirm-license -opensource -platform win32-msvc2013 -debug-and-release -static-prefix "D:\qt-static-build\Qt5.4.2-static-vs2013"-qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples -icu -openssl
        11、上面的命令执行完后,输入命令:nmake,然后就是漫长的等待了,要几个小时呢。
        12、nmake执行完后,输入命令:nmake install
 
到此编译QT的过程已经完成了。这时候你会在 D:\qt-static-build 里面找到文件夹 Qt5.4.2-static-vs2013,这里面的所有东西都是我们静态后生成的文件。
 
下面是QWebKit的编译
 
        先说下遇到的坑吧,不想看的可以忽略。
        1、MTd与MDd不匹配的错误提示,这个问题我找了好长时间,原因我知道,是因为QWebKit是以MDd形式编译的,但是就是
不知道为什么要以MDd形式编译,后来我搜了下,发现Makefile文件里的参数是MD,我曾经想过要把所有Makefile里面的MD都改成MT
,但是感觉这个不靠谱,因为这些Makefile文件是动态生成的,所以肯定是生成的过程出问题了。搞了好长时间,后来发现是环境变量的
问题,由于我之前是用从官网下的exe文件安装的Qt,当时将qmake.exe所在的bin目录放到了环境变量里面。我将这个环境变量删掉,
换成上面静态编译后生成的qmake.exe所在的bin目录(F:\Qt\Qt5.4.2-static-vs2013\bin),这个问题就解决了。
        2、安装bison的时候我放到了Program Files (x86)这个目录下面,结果命令行就将这个路径当成两个命令来处理了。就提示报错了
没找到命令。这真实太坑了。把它安装到不包含空格的目录里就好了。
 
 
先准备要用到的软件
        1、ActivePerl-MSWin32.msi
        2、bison-setup.exe
        3、gperf-bin.zip
        4、rubyinstaller.exe
        5、win_flex_bison.zip
    由于编译过程中用到了上面的命令,所以这些软件是缺一不可的。装完之后,记得要添加环境变量
 
 
上面的命令工具不要关,执行下面命令
set PATH=%PATH%D:\qt-static-build\Qt5.4.2-static-vs2013\bin;
set INCLUDE=%INCLUDE%D:\qt-static-build\Qt5.4.2-static-vs2013\include;
然后执行命令(如果要编译成release,将--debug改成--release即可)
perl D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2\qtwebkit\Tools\Scripts\build-webkit --qt --debug --prefix=D:\qt-static-build\Qt5.4.2-static-vs2013
 
执行一次后,会暂停下来,再执行一次即可。
然后就是再次漫长的等待了!
 
 
期间碰到了下面的几个错误:
错误 1、
解决办法是:找到 F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\Source\WebCore\platform\text\TextEncodingRegistry.cpp:301
改 #if OS(WINDOWS) 为 #if OS(WINCE)
 
错误 2、
解决办法是:找到 F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\Source\WebCore\platform\qt\QtTestSupport.h
修改:
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT Q_DECL_EXPORT
#else
#define TESTSUPPORT_EXPORT Q_DECL_IMPORT
#endif
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT /*Q_DECL_EXPORT*/
#else
#define TESTSUPPORT_EXPORT /*Q_DECL_IMPORT*/
#endif
 
然后重新执行上面的命令。
 
最后执行下面的命令,将生成的libs和头文件放到D:\qt-static-build\Qt5.4.2-static-vs2013里面
cd F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\WebKitBuild\Debug
nmake install
 
 
至此,整个Qt和QWebKit已经编译完成。
 
 
我将文件组织了下
在 D:\qt-static-build\Qt5.4.2-static-vs2013 里面新建目录 thirdpart 将上面的icu和ssl文件夹复制到里面,然后新建webkit目录,将webkit用到的库复制到里面
如图:
 
 
静态编译后的文件我已经上传到我的网盘了,大家可自行去下载。http://pan.baidu.com/s/1mhquqSC
 
 
下面来新建项目测试一下
 
        添加环境变量
        变量名:QTDIR-STATIC
        变量值:D:\qt-static-build\Qt5.4.2-static-vs2013
 
 
用VS2013创建项目
        
        1、打开VS2013,文件 -> 新建项目 -> 模块 -> Visual C++ -> Win32 -> Win32 项目,输入项目名称QtStaticTest,点击确定按钮,创建一个新项目。然后在Win32 应用程序向导里面选择新项目,点击完成。如图:
        2、修改项目属性,右击 项目 -> 属性,打开属性页面。
             配置属性 -> C/C++ -> 常规    附加包含目录,修改为$(QTDIR-STATIC)/include,如图:
             配置属性 -> C/C++ -> 代码生成    运行库,改为MTd,如图:
             配置属性 -> 链接器 -> 常规    附加库目录,添加
$(QTDIR-STATIC)\lib
$(QTDIR-STATIC)\plugins\platforms
$(QTDIR-STATIC)\plugins\imageformats
$(QTDIR-STATIC)\plugins\bearer
$(QTDIR-STATIC)\thirdpart\icu\lib
$(QTDIR-STATIC)\thirdpart\ssl\lib
$(QTDIR-STATIC)\thirdpart\webkit\lib
,如图:
             配置属性 -> 链接器 -> 输入    附加依赖项,添加以下内容:
/OPT:REF
qtmaind.lib
Qt5Cored.lib
Qt5Guid.lib
Qt5Widgetsd.lib
Qt5PlatformSupportd.lib
Qt5OpenGLd.lib
Qt5WebKitd.lib
Qt5WebKitWidgetsd.lib
Qt5MultimediaWidgetsd.lib
Qt5PrintSupportd.lib
Qt5Networkd.li
Qt5Sensorsd.lib
Qt5Sqld.lib
Qt5Positioningd.lib
Qt5Multimediad.lib
qwindowsd.lib
qddsd.lib
qicnsd.lib
qicod.lib
qjp2d.lib
qmngd.lib
qtgad.lib
qtiffd.lib
qwbmpd.lib
qwebpd.lib
WebKit1d.lib
WebCored.lib
version.lib
ANGLEd.lib
leveldbd.lib
JavaScriptCored.lib
WTFd.lib
sicuind.lib
sicuucd.lib
sicudtd.lib
winspool.lib
shlwapi.lib
rpcrt4.lib
comdlg32.lib
oleaut32.lib
imm32.lib
winmm.lib
glu32.lib
opengl32.lib
gdi32.lib
qtharfbuzzngd.lib
qgenericbearerd.lib
qnativewifibearerd.lib
dnsapi.lib
crypt32.lib
kernel32.lib
user32.lib
shell32.lib
uuid.lib
ole32.lib
advapi32.lib
ws2_32.lib
mpr.lib
这里面有的库,可能用不到,大家可自行删除。
如图:
 
        3、新建文件main.cpp。添加以下内容:

#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QMainWindow>
#include <QtWebKitWidgets/QWebView> #ifdef QT_STATIC
#include <QtCore/QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
Q_IMPORT_PLUGIN(QDDSPlugin)
Q_IMPORT_PLUGIN(QICNSPlugin)
Q_IMPORT_PLUGIN(QICOPlugin)
Q_IMPORT_PLUGIN(QJp2Plugin)
Q_IMPORT_PLUGIN(QMngPlugin)
Q_IMPORT_PLUGIN(QTgaPlugin)
Q_IMPORT_PLUGIN(QTiffPlugin)
Q_IMPORT_PLUGIN(QWbmpPlugin)
Q_IMPORT_PLUGIN(QWebpPlugin)
Q_IMPORT_PLUGIN(QGenericEnginePlugin)
Q_IMPORT_PLUGIN(QNativeWifiEnginePlugin)
#endif // QT_STATIC int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow* window = new QMainWindow();
window->resize(, );
QPushButton* btn = new QPushButton(window);
btn->setText("Hello World!");
btn->setGeometry(, , , );
QWebView* webView = new QWebView(window);
webView->setGeometry(, , , );
webView->setUrl(QUrl("http://www.163.com"));
window->show();
return app.exec();
}
运行,如图:
 
好了,一个Hello World已经成功运行了。
 
注意一点,用到的Plugins要通过Q_IMPORT_PLUGIN,导入进去。否则的话就会报错了。
 
有人会问,上面要引用那么多lib文件我是怎么知道的,其实我是先通过QtCreator创建一个项目,成功编译并运行后,通过命令
qmake -r -spec win32-msvc2013 -tp vc 转化为VS2013项目,然后启动后,查看项目属性才知道的。
 
 

QT5.4.2静态编译(包含QtWebKit),在VS2013上创建项目,并成功运行的更多相关文章

  1. Qt5.3.1 静态编译的configure

    今天最终自己静态编译过了QT5.3.1, 成功用在项目上了, 记录下configure指令.  configure -confirm-license -opensource -platform win ...

  2. 笔记-linux下Qt5.3.2 静态编译

    这里主要讲linux下的编译,windows下面比较简单 参考:http://qt-project.org/wiki/Building-Qt-5-from-Git 依赖 sudo apt-get in ...

  3. Qt5如何设置静态编译,解决生成的可执行文件打开出错问题

    将https://yunpan.cn/cqGGURjmG2fEY  访问密码 8de5  中的压缩包Qt5-MSVC-Static-master.zip 解压到你的qt安装目录,一般就是C:\Qt下, ...

  4. Qt5.4.1_静态编译

    http://www.cnblogs.com/findumars/p/4852350.html http://godebug.org/index.php/archives/133/ http://ww ...

  5. [COCOS2DX]COCOS命令新建项目+编译安卓项目并成功运行

    全程搭建过程参考网址: http://blog.csdn.net/lengxue789/article/details/38116475 http://blog.csdn.net/cbbbc/arti ...

  6. QT5静态编译教程,主要针对vs2012(渡世白玉)

    QT5,VS2012静态编译,所有的库准备充分的话qwebkit也可以静态编译通过,但是我编译的版本使用中如果用了QWEBVIEW控件在连接时会出错. 注:我自己编译的环境是:win server 2 ...

  7. Qt5.4静态编译方法

    静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库.这样就可以发布单 ...

  8. JIT(动态编译)和AOT(静态编译)编译技术比较

    Java 应用程序的性能经常成为开发社区中的讨论热点.因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言.尽管 ...

  9. 详解Qt,并举例说明动态编译(shared)和静态编译(static)以及debug and release 编译版本区别(可产生静态版的Debug版本,需要把-release 改为 –debug-and-release)

    作为初入Qt学习的新人,花了整整一两天时间,对Qt编译版本等问题进行了一步步探索,首先感谢网站博客中文章,开始也不是很明白一些几个问题: 1.Qt版本问题 作为初学者,可能下载时这么多版本,如何选择呢 ...

随机推荐

  1. BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 29035  Solved: 7604 Descript ...

  2. LayUI把表格中的时间戳改成格式化的时间

  3. Bootstrap框架(二)

    day58 巨幕 这是一个轻量.灵活的组件,它能延伸至整个浏览器视口来展示网站上的关键内容. Hello, world! This is a simple hero unit, a simple ju ...

  4. Java之集合(二十四)ConcurrentLinkedDeque

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7517454.html 1.前言 本章介绍并发队列ConcurrentLinkedDeque,这是一个非阻塞,无锁 ...

  5. SpringBoot学习之自动装配

    在前面使用SSM集成时,我们可以使用注解实现无配置化注入,但是这种依赖被进行“人工干预了的”,换句话就是说我们手动进行装配,那么此时还没有达到SpringBoot这种自动装配的效果,那么究竟Sprin ...

  6. python中使用eval() 和 ast.literal_eval()的区别 分类: Python 2015-05-11 15:21 1216人阅读 评论(0) 收藏

    eval函数在python中做数据类型的转换还是很有用的.它的作用就是把数据还原成它本身或者是能够转化成的数据类型. 那么eval和ast.literal_val()的区别是什么呢? eval在做计算 ...

  7. pict总结

    pict总结 pict总结 Friday, September 25, 2015 12:03 PM pict:微软出品的一个自动生成case工具,运用组合测试方法 1 pict安装 2 pict环境变 ...

  8. Picasso处理同一url,但资源变了的情况

    问题:上传头像成功后,头像的url没变,加载头像时还是从缓存中根据url加载以前的图片. 这个问题,很多人遇到过.也受到很多同行的启发. 图片url不变,感觉不是很合理,这样会把缓存搞乱. 但是,作为 ...

  9. Apache Hadoop 源码阅读(陆续更新)

    不多说,直接上干货! 总之一句话,这些都是hadoop-2.2.0的源代码里有的.也就是不光只是懂理论,编程最重要,还是基本功要扎实啊.... 在hadoop-2.2.0的源码里,按Ctrl + Sh ...

  10. VMware workstation 11 的下载

    不多说,直接上干货! VMWare Workstation 11的下载详细: 谷歌FQ,进入. 具体怎么达到可以FQ,见 FQ软件lantern-installer-beta.exe(推荐) 成功! ...