QT静态编译相关知识介绍
如需要开发一个不带运行库的程序,也就是只有一个单独的exe,不带任何dll。然而qt官方提供的都是动态库,所以需要自己搭环境编译静态库。在此,先解释一下库是什么,动态库是什么,静态库是什么,然后再进行QT静态编译安装流程的介绍。
库是什么
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。
所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:
静态库是什么
之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。
静态库特点总结:
l 静态库对函数库的链接是放在编译时期完成的。
l 程序在运行时与函数库再无瓜葛,移植方便。
l 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
Linux下使用ar工具、Windows下vs使用lib.exe,将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索。一般创建静态库的步骤如图所示:
动态库是什么
通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?为什么还需要动态库?为什么需要动态库,其实也是静态库的特点导致。空间浪费是静态库的一个问题。
另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
动态库特点总结:
l 动态库把对一些库函数的链接载入推迟到程序运行的时期。
l 可以实现进程之间的资源共享。(因此动态库也称为共享库)
l 将一些程序升级变得简单。
l 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。
Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。
l 在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。
l Linux下gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。
与创建静态库不同的是,不需要打包工具(ar、lib.exe),直接使用编译器即可创建动态库。
1 静态编译环境开始安装:下载并安装vs2017
(1)下载并安装Visual Studio Professional 2017,下载地址为:
下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux
https://my.visualstudio.com/Downloads?q=Visual%20Studio%202017
(2)勾选“使用C++的桌面开发”并执行安装即可
2 下载并安装cmake
下载地址如下:
其它安装过程就不说了,一直点就行了,只是注意一下下面这个步骤,选择第二个,添加到系统环境变量中;
3 下载并安装ninja
下载地址如下(建议使用谷歌浏览器打开网站):
Releases · ninja-build/ninja · GitHub
解压后就是一个exe文件,特地为它加个环境变量有点大可不必了,所以我就直接把它移动到了系统盘路径里面。
4 下载并安装perl
下载地址如下:
5 下载并安装python
下载地址如下:
https://www.python.org/downloads/windows/
6 下载并安装ruby
Ruby下载地址:
https://rubyinstaller.org/downloads/
安装ruby时候,请记得勾选自动添加到环境变量中
7下载Qt源码
Index of /archive/qt/5.12/5.12.0/single
也可以去清华大学开源软件镜像站下载:
Index of /qt/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
8 查看下载的安装包是否都安装成功
输入如下命令,查看安装是否成功;
python -V
perl -v
cmake --version
ninja --version
ruby --version
注意:由于上面那些软件将自己的路径加在了系统环境变量,所以想要生效需要电脑重启一下;如果安装不成功,请重新安装,路径不用使用中文路径
9 开始编译QT源码
在Windows上,有两个预构建环境可供选择:一个是MinGW,另一个是Microsoft Visual Studio(MSVC)。这两个环境不兼容,无法混合。你必须选择一个。
这两者的区别如下:
当你的项目使用MinGW编译的使用,想要用一个MSVC编译生成的库时就会有问题。使用MinGW编译项目的时候,所使用的Lib也要是MinGW编译的。如果你只是开发Window平台的软件时,最好用Qt MSVC组合,这样可以使用大量的第三方lib,还有很多的构建指令,毕竟window上MSVC才是王道。
(1)解压qt-everywhere-src-5.12.0.zip
(2)修改源码里的qtbase\mkspecs\common\msvc-desktop.conf文件
修改-MD为-MT;其中D的意思是动态编译(dynamic),T的意思是静态编译(static)源码:
改为:
(3)在应用程序中打开如下,点击进入
进入源码目录,并输入如下命令:
configure.bat -static -prefix "D:\Qt\qt5.12.0-static" -confirm-license -opensource -debug-and-release -platform win32-msvc -nomake examples -nomake tests -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -mp
具体含义如下:
configure.bat
-static //指明是静态编译
-prefix "D:\Qt\qt5.12.0-static" //指明安装的目录
-confirm-license -opensource //指明是开源版本的qt
-debug-and-release //指明需要debug版和release版,可以单独选择release版
-platform win32-msvc //指明使用msvc编译
-nomake examples -nomake tests //不编译样例
-plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg //可选插件
-opengl desktop
-mp //多核编译
(4)执行成功上面命令后,会提示输入nmake和nmake install
有两个预构建环境可供选择:一个是MinGW,另一个是Microsoft Visual Studio(MSVC)。
我选择的是msvc环境,使用命令nmake即可进行编译。
执行命令(会花几个小时):nmake
再执行命令(主要是复制文件也要花1个小时左右):
执行nmake和nmake install后生成的文件夹qt5.12.0-static,有3G左右;
注:
MSVC自带的nmake没有多线程编译功能,有一个替代功能的软件jom可以进行nmake的多线程编译
点击jom.exe;在执行
进入源码目录,并输入如下命令:
configure.bat -static -prefix "D:\Qt\qt5.12.0-static" -confirm-license -opensource -debug-and-release -platform win32-msvc -nomake examples -nomake tests -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -mp
执行成功后,会提示使用jom命令进行nmake和install操作,会快很多;
10 下载并安装Qt Creator
下载地址如下:
注册账号
可以选择MSVC201764-bit,和MinGw7.3.0 64-bit安装,安装好后可以不用,用上面安装好的静态包
11 配置静态版本的Qt构建套件
11.1 打开安装的Qt Creator
11.2 配置Qt Versions
11.3 配置构建套件(kit)
命一个名为Qt_5.12.0_static;选择编译器C,C++;qt版本选择安装的静态版本
11.4 创建静态编译的QT Creator工程
(1)打开QT Creator
(2) 点击”文件” ->”新建项目”,
(3)输入文件名,点击下一步
(4)选择构建套件,这里选择静态编译的构建套件 ;新建MainWindow的窗体类型,编写代码
(5)执行“qmake”后,执行“构建”,再点击运行
运行后生成如图界面
(6)生成如下.exe文件,可以拷贝到任意电脑进行运行,运行时无需拷贝包含其他文件;此文件比动态编译生成的exe文件大
D:\001_qt_test\hello_world\build-hello_world-Qt_5_12_0_static-Release\release