Qt入门之基础篇(三):掌握Qt4的静态编译基本方法
转载载请注明出处:CN_Simo.
导语:
前两章都提到过“静态编译”(Static Compilation),在Windows下一次静态编译差不多需要长达三个小时才能完成,而且还非常容易由于各种原因而出错。那么为什么要花这时间去干这件事情呢!我当初只是想用Qt做一个exe贺卡发给同学,但是通常情况下,我们做出的exe需要各种dll动态链接文件才能正常运行(压缩打包给别人?直接发送一个exe文件都懒得打开,更何况还需要解压呢),那么我就想能不能只需要一个exe就可以呢?
“静态编译”的作用正是让exe脱离dll的束缚,但是同时你的exe可能比之前要大好几倍(没办法,万物都无绝对完美)。前言说到这里,我们就进入正文来:
文章思路:
- 准备编译所需环境及文件;
- 编译Qt4.8.6源码;(此过程或许要花掉你一上午的时间,要有良好的心理素质哦!)
- 配置Qt静态库到Qt Creator;
- 静态模式重新编译Hello World程序;
- 找到exe程序与之前版本进行大小对比;
- 总结说明。
Let‘s start:
编译准备:
所需环境:
配置当然是越好越快了,我的配置编译了一上午。
所需文件:
- qt-everywhere-opensource-src-4.8.6.zip
- 教程一中安装好的Qt(版本4或5都可)
前期工作:
步骤一:配置编译文件qmake.conf
我将zip解压到E盘,qmake.conf文件就在源码目录\mkspecs\win32-g++中,用记事本打开修改下列参数:QMAKE_LFLAGS和QMAKE_LFLAGS_DLL。参数值为 -static,如下图:
修改完之后,我在E盘新建一个“qt4.8.6_static”文件夹作为编译输出目录,并且需要将更改后的“mkspecs”文件夹复制到qt4.8.6_static文件夹中。若不做此操作步骤三可能会报错,类似下面这样
- Could not find mkspecs for your QMAKESPEC(win32-g++) after trying:
- E:/qt/qt4.8.6_static\mkspecs
步骤二:设置环境变量以及所需编译内容
开始菜单中打开Qt命令窗口,cd命令进入源码目录:
- e:&cd e:\qt-everywhere-opensource-src-4.8.6
下面所有操作都在本目录中进行。
输入以下两条命令:
- set QMAKESPEC=win32-g++
- configure -confirm-license -opensource -prefix “F:\Qt\Qt_4.8.6_static” -debug-and-release -static -platform win32-g++ -nomake demos -nomake examples -nomake tests -fast -mp
- set命令设置环境变量(注意:窗口关闭将清空设置,需重新设置)
- configure命令配置编译内容,参数说明:
回车后,看到以下信息代表完成:
开始编译:
- mingw32-make
输入命令开始编译,此过程最易出错,因为持续时间长,中间可能遇到很多自己解决不了的问题,此时只能是重新开始。如果过程中未出错的话可能需要3个小时以上才能结束(我的电脑配置见上),你可以去做别的事情了,在编译过程中最好不要用电脑去做其他占用大量系统资源的事情,因为这么做将会大大增加失败的几率。
编译结束:
结束之后,输入下面命令开始一大堆的复制命令,这时你可以看到qt4.8.6_static目录已经开始急剧膨胀了。
- mingw32-make install
大概15分钟即可复制完毕。
要注意,如果移动或者更名qt4.8.6_static目录,将导致bin目录中的程序异常,下面操作可解决此问题:
在bin目录下创建一个qt.conf文件,内容这么写:
- [paths]
- Prefix = ..
如此,便可进行移动或更名操作了。
配置Qt Creator:
打开qt creator,【工具】-【选项】-【构建和运行】,在里面添加刚编译出的qt4.8.6静态版本(qmake路径选择bin目录中的qmake.exe哦),之后添加新的构建套件,qt版本选择qt4.8.6,名称随意,如下图:
Hello World测试:
【新建】一个project,构建套件选择刚刚添加的。在这里,我续用教程二中的helloworld项目测试一下。
打开helloworld项目后,crlt+5将新的构建套件添加上去,点击左下角【部署构建套件】按钮分别选择原有Kit和静态版Kit的release版本运行项目,几秒钟后即可看到helloworld运行界面:
exe文件对比:
寻找exe生成目录,找到两个exe文件,惊奇的发现了这个结果:
(右面是由我们的qt静态库编译生成的程序,左面则是原来的)
结果显示:
- 同样是release版本的,所产生的helloworld程序大小完全不在一个等级(一个KB级别,一个MB级别),静态编译败;
- 动态编译出的exe文件想要打开需要dll动态链接文件的支持,静态链接编译出的exe文件则可以直接打开,不再需要dll文件的束缚,静态编译胜;
总结说明:
通过上面结果可以看出:动态编译和静态编译都有各自优缺点,我们应该适当选择自己所需;
qt源码编译的过层拖得越长越是容易出错误,选择一台配置好点的电脑可以适当增加编译速度;
通过本章知识,我们的内心或许会嫌麻烦又或许会觉得很有趣,如果你是后者希望以后的学习你能够越来越出色。
让我们一起期待下期内容吧[@CN_Simo]!
结束语:
上一篇:Qt入门之基础篇(二):Qt项目建立、编译、运行和发布过程解析
Qt入门之基础篇(三):掌握Qt4的静态编译基本方法的更多相关文章
- Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装
转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...
- Qt入门之基础篇(1):Qt4及Qt5的下载与安装
转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...
- Spring Boot 入门之基础篇(一)
原文地址:Spring Boot 入门之基础篇(一) 博客地址:http://www.extlight.com 一.前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是 ...
- NIO相关基础篇三
转载请注明原创出处,谢谢! 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相关话题内容,主要谈谈一些Linux 网络 I/O模型.零拷贝等一些内容, ...
- docker+k8s基础篇三
Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...
- 小白入门Docker基础篇
docker是什么 百科上的解释是这样的: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...
- Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理
本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...
- Python基础篇(三)_函数及代码复用
Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...
随机推荐
- Win10系统安装Tomcat8
1.JDK 1.8 安装 1.1.在网站上http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151. ...
- jquery ajax promise
$request = $.getJSON('test.php'); $request.done(process1); $request.done(process2); $request.always( ...
- 为什么ajax 必须同源,same origin policy
ajax 所有请求都会附带主域的cookie, 若没有同源策略,攻击者就可以获取你的cookie,状态.
- Zepto swipe 无效(坑)
Zepto 滑动插件 bug Zepto 的 'swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown' 触摸事件在安卓4.4系统中除chro ...
- 位运算,算术、逻辑运算详解-java篇
/** * 功能: * 位运算符,原码.反码.补码规则: * 1.二进制的最高位是符号位:0表示正数,1表示负数 * 2.正数的原码.反码.补码都一样 * 3.负数的反码=它的原码符号位不变,其他位取 ...
- Windows server 2008 R2 64位系统安装ZendOptimizer-3.3.0a-Wind
如果不安装ZEND的话,一些PHP网站程序使用ZEND加密后就无法使用,比如DISCUZ,SHOPEX,ECSHOP等,所以要想安装这些程序,ZEND是一定要安装的,要不会出现乱码等问题. 安装ZEN ...
- 使用karma+jasmine做单元测试
目的 使用karma和jasmine来配置自动化的js单元测试. Karma和Jasmine Karma是由Angular团队所开发的一种自动化测试工具.链接:http://karma-runner. ...
- Android中支持的距离单位
px(像素):每个px对应屏幕上的一个点 dip或dp(device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dip=1px.但 ...
- java中Integer比较需要注意的问题
java中Integer比较需要注意的问题 package com.srie.test; import java.util.HashMap; import java.util.Map; public ...
- JavaScript的4种this调用模式
方法调用模式:函数调用模式:构造器调用模式:apply调用模式: 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为一个方法.当一个方法被调用时,this被绑定到该对象. 函数调用模式: ...