windows下 Qt 静态编译
似乎一直没有静态编译Qt的需求:一不在没有管理员权限的机器上使用,二不制作绿色软件,三...。动态编译工作得很好,再配合 nsis 制作一个安装包,有什么必要静态编译呢?
但论坛中似乎总是不停有人问到静态编译的问题,似乎遇到问题的人挺多,用百度或google搜索"Qt静态编译"也能搜到相当多的内容。
正好利用周末时间,自己尝试编译一下,顺便整理一下,看看到底会发生什么(尽管以后还是用动态编译)。
没特殊说明的话,以下讨论的是 MSVC2008 下的情况:
静态编译?
或许有两个层次:
编译出的程序不依赖 QtCore4.dll、QtGui4.dll 等 Qt 的静态库
- 编译出的程序不依赖 msvcr90.dll、msvcp90.dll 等 C、C++ 的运行库
编译Qt
Qt 默认是动态编译的,下载Qt的源码,解压,而后运行(当系统中有多套编译环境时,需要通过platform参数指定所用编译环境 -platform win32-msvc)
configure
然后运行 nmake 就进入漫长的等待了,结束后Qt编译就完成了。
运行 configure -h 可以得到详细的帮助信息,包括默认启用哪些参数等。
* -shared ............ Create and use shared Qt libraries.
-static ............ Create and use static Qt libraries.
如果我们要静态编译,只需要在 configure 后添加 -static 就行了。当然根据个人喜好,你可能会添加更多的参数,比如 -no-qt3support 禁用 qt3 支持模块等,不过这与静态编译没有直接关系了。
这样一来,我们将得到
QtCore.lib QtCored.lib 等静态库
而不是
QtCore4.lib QtCored4.lib 等导入库
QtCore4.dll QtCored4.dll 等动态库
去除C、C++运行库的依赖
通过 configure 的 -static 选项,我们可以编译出 Qt 的静态库,如果只是不想发布程序时发布Qt的动态库,这个已经完成了。
但是,它们仍依赖 C、C++ 的运行库。如果还想去除该依赖,需要在静态编译Qt之前手动修改
%QTDIR%\mkspecs\win32-msvc2008\qmake.conf
将 QMAKE_CFLAGS_RELEASE 和 QMAKE_CFLAGS_DEBUG 中的 -MD -MDd 分别修改为 -MT 和 -MTd 即可。 这4个参数的含义很容易通过
cl /?
得到
另外,还可以将 CONFIG 中的 embed_manifest_dll embed_manifest_exe 去掉(也可以不去掉)。
注意:对 qmake.conf 的修改最好放在运行 configure 之前,不然的话,修改后还需要手动运行(原因你知道的 ;-) )
qmake -r如何加快编译
编译 Qt,应该是一个比较费时费力费空间的(磁盘中没有15G的空闲空间,都不敢编译Qt4.7)。编译时有选择地去掉一些东西是比较合适的
禁止编译不需要的模块,比如 Qt3Support,QtWebkit,等
- 运行 configure -h 可以得到详细的参数列表
- 禁止编译例子和demo,当系统中存在多套Qt时,编译例子确实不太需要,但 configure 没有相应的参数来禁止 demo 和 例子
非windows系统下 configure 似乎支持 -nomake examples -nomake demos
- 可以直接移除 demoes 和 examples 目录(移除肯定就不会编译了,但个人不喜欢这个)
- 可以修改 Qt 根目录下的 projects.pro 文件
方法一 注释掉 SUBDIRS += demos 这样的行
方法二 直接修改 QT_BUILD_PARTS = libs tools examples demos docs translations
可以修改 Qt 根目录下的 .qmake.cache 中的 QT_BUILD_PARTS
- 运行完 configure 后,我们也可以通过运行 make sub-src 而不是 make 来避免编译非必须的东西
- 编译完成后,运行 make confclean 来清理编译过程中的中间产物
插件问题
- 动态编译时,插件似乎困扰不少人,经常有人抱怨,程序发布后,jpeg图片无法显示?中文显示乱码等等?
- 解决方法很简单,发布时带上插件就行了(注意路径)
- 当采用静态编译后,插件问题更严重了,为什么呢?插件都成静态库了,无法动态加载了(或许已不能被称为插件了)
看 QtPlugin 的Manual,有关于静态插件的使用介绍
- 看例子中 tools/plugandpaint 例子,使用的静态插件
常用插件
- 图片插件 qgif qjpeg qico 等
- 数据库 qsqlite 等
- 东亚语言 qcncodecs 等
- phonon 后端支持插件
- QStyle 插件
- ...
静态编译时插件的使用(比如,jpeg和gb2312的支持):
- 在 cpp 文件(main.cpp)内添加语句
#include<QtPlugin>
Q_IMPORT_PLUGIN(qjpeg)
Q_IMPORT_PLUGIN(qcncodecs)
- pro 文件内添加
QTPLUGIN += qjpeg qcncodecs对于Mingw
采用 Mingw 静态编译Qt的步骤和上面基本一样(给configure传递 -static参数)。
再就是,修改
%QTDIR%\mkspecs\win32-msvc2005\qmake.conf
为 QMAKE_LFLAGS 添加 -static 选项
但是 MinGW 编译的程序会依赖下面的动态库
- mingwm10.dll
- libgcc_s_dw2-1.dll
对后libgcc这个库,似乎还好办,一种说法是修改 <QTDIR>\qmake\Makefile.win32-* 中的
LFLAGS =
为
LFLAGS = -static-libgcc
这个我没试,Qt4.6.3中 LFLAGS 默认确实为空,但Qt4.7中默认已经添加了该选项
对与 mingwm10 这个动态库,似乎比较难办。因为它似乎和
- 异常
- 线程
有关。
参考
http://qtnode.net/wiki?title=Building_static
http://qtnode.net/wiki/Qt4_with_Visual_Studio_and_static_C_runtime
http://www.formortals.com/how-to-statically-link-qt-4/
http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/
http://www.qtcentre.org/threads/29489-Removing-dependencies-for-mingwm10.dll-and-libgcc_s_dw2-1.dll-static-linking
http://blog.lugru.com/2010/04/static-qt-compilation-and-mingwm10-dll-mingw-confusion/
windows下 Qt 静态编译相关推荐
- linux下qt静态编译_自由出土文物的空间_百度空间
linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译 2012-04-09 13:10 测试通过,贴一下过程,仅用来 ...
- Qt5.8 在windows下mingw静态编译
官方对编译一些条件介绍:https://doc.qt.io/qt-5/windows-requirements.html 在默认情况下,用QtCreator编译程序时,使用的是动态编译.编译好的程序在 ...
- Qt5.10.1在Windows平台下进行静态编译
本文最后更新于2018-6-20,可能会因为没有更新而失效.如已失效或需要修正,请联系我! Qt静态编译的最大好处就是可以直接产生能够不依靠多余的dll运行的exe文件, 而且exe文件会比动态编译的 ...
- c语言与qt编写安卓,Windows下Qt for Android 编译安卓C语言可执行程序
作为 C/C++ 程序员,有时候我们希望在安卓上运行从 C/C++ 生成的可执行程序,而不是在 Java 中通过 jni 的方式来调用 C 动态库.有两个途径可以达到这个目的:一 作为 C/C++ 程 ...
- Qt 静态编译(5.15.2 MinGW 32-bit)
Qt 静态编译(5.15.2 MinGW 32-bit) 文章目录 Qt 静态编译(5.15.2 MinGW 32-bit) 摘要 1 编译前准备 1.1 编译环境准备 系统环境 Qt 版本 gcc ...
- qt 静态编译 -- 生成exe单文件 别的电脑可以直接用
qt 静态编译 收集 https://github.com/last2win/qt-5.13 Qt最新版5.13在Windows环境VS 2017 64位静态编译完成的结果 此仓库很大,建议直接下载压 ...
- 拿来主义——QT静态编译配置
如何快速完成QT静态编译的配置(windows)↓↓↓ 0.写在前面 1.下载原版QT 2.开始"拿来"--下载别人编译好的 2.1检查自己的QT路径 2.2下载已经编译好的QT ...
- 手把手教你在windows下源码编译Open3D
文章目录 前言 1.编译环境 2.编译步骤 3.编译中的bug 3.1 下载超时问题,ispc.pybind11.open3d_sphinx_theme等 3.2 boringssl 3.3 Dire ...
- Windows下使用VS2019编译libiconv-1.16
Windows下使用VS2019编译libiconv-1.16 参考了 https://blog.csdn.net/zhouguangcai8/article/details/105270657,在其 ...
最新文章
- 在 Spring Boot 中,如何干掉 if else
- Windows 7 下如何调整网卡的优先级
- 计算机软件资源包括哪些部分组成,操作系统的计算机系统资源包含哪些
- 【转】Linux 前后台作业切换及脱机管理
- OpenCV3源代码目录解析(算法模块解析 和 示例目录解析)
- java textfield 数字,如何将整数转换为文本以便在textfield java-blackberry中使用
- 24-Logistic Regression
- 01、python数据分析与机器学习实战——Python数据可视化库-Matplotlib
- 更改微信小程序的基础版本库;更改uni-app小程序基础库;更改用户的微信小程序基础库最低版本;设置用户的微信小程序版本库;
- NS2相关学习——无线网(2)
- (97)FPGA DCM与PMCD区别?
- kafka修改默认端口号
- 为什么要搭建数据平台
- 编程必备基础知识-计算机组成原理-01概述篇-笔记
- 【IP路由基础(直连路由、静态路由的三种配置)】--20211203、20211206
- C. Minimum Notation #823 div2
- JSON与聚合数据不解之缘二
- nmn抗衰老是骗局吗,美国nmn骗局,正面解答
- pyqt:让qlabel的图片根据鼠标指向的位置进行放缩
- python找出某个文件夹下某个后缀的文件
热门文章
- 10没有基于策略的qos_基于强化学习的用户移动场景下空中基站3D位置高效部署...
- Hadoop与Hbase基本配置
- bash之逻辑控制---for语句
- app每次更新版本时调用js代码提示用户下载更新
- 消息队列如何保证顺序性?
- BZOJ4589: Hard Nim(FWT 快速幂)
- zabbix添加对web页面url的状态监控
- Codeforces1063D Candies for Children 【分类讨论】【暴力】
- react native windows 搭建(完整版)
- C#的winform拼数字游戏