目录
1.环境和工具
2.CMake编译
3.查找依赖文件
3.1.windeployqt
3.2.dumpbin
4.总结
相关链接
QSimpleUpdater:解锁 Qt 应用自动更新的全新姿势-CSDN博客
1.环境和工具
windows 11, x64
Qt5.12.12或Qt5.15.2
CMake 4.0.2
干净的windows 7,最好是用windows7的iso安装出来的
虚拟机VirtualBox
Everything
2.CMake编译
进入QSimpleUpdater的源码目录,新建build文件夹:
进入build目录,执行命令:
cmake ../
出现报错,需要设置一下Qt的目录,因为cmake找不到Qt在哪里,配置并重新执行命令:
生成VS2022工程成功
你可以用VS2022打开QSimpleUpdater.sln工程,全部编译就会生成库文件和测试执行文件,当然也可以直接用CMake去编译,如下:
于是在build目录下的Release中生成了目标文件:
直接运行UnitTests.exe出现:
3.查找依赖文件
3.1.windeployqt
在命令行模式进入C:\Qt\5.12.12\msvc2019_64\bin,然后运行:
然后在UnitTests.exe的目录下查找到Qt的库依赖:
从截图可以看到,用这个工具只能查找Qt的依赖,系统的一些依赖是不能打包进去的
然后把这个程序打包放到干净的win7下面运行报错:
说明安装包里面少了一些依赖库。
3.2.dumpbin
Dumpbin是Windows环境下用于分析可执行文件内部结构的命令行工具,由Microsoft Visual C++提供。它能够揭示二进制文件的详细内容,如导出函数、导入函数、资源等,特别有助于调试DLL。主要功能包括:
- 查看文件头信息:包含 PE 文件结构、子系统、DLL 特性等
- 分析导出表:列出 DLL 中导出的函数和变量
- 分析导入表:显示程序依赖的外部函数和 DLL
- 依赖分析:检查二进制文件依赖的所有动态链接库
- 符号表查看:显示 COFF 符号表信息,用于调试和链接分析
- 资源查看:查看二进制文件中包含的资源(图标、菜单、字符串等)
dumpbin.exe在vs2022的安装目录下"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin"
从开始进去中的Visual Studio 2022菜单下:
在命令行中输入dumpbin会出现:
继续在命令行中输入:
可以看到UnitTests.exe的依赖库,可以看到除了Qt的库外还有一些系统的库,通过Everything软件查找的库大致在两个地方:
依次从这两个目录中把上面依赖的文件拷贝到打包目录中,然后打包,再把打包的程序放在win7上面去运行:
还是报错误,找不到MSVCP140.dll,于是又在原来的电脑上查找库MSVCP140.dll,拷贝到win7上
拷贝MSVCP140.dll到win7上运行程序:
报错了,程序崩溃了。
在网上查找了一下原因:
0xc000007b:
表示 “应用程序无法正常启动”,通常是因为缺少 UCRT 或运行时库。0xc0000135:
表示 “找不到 DLL”,需检查依赖的 DLL 是否在系统中存在。
于是又把目录C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Remote Debugger\x64目录里面的文件全部拷贝过去,把比较明显不需要的删掉。
拷贝到win7,运行,报如下错误:
还是缺少msvcp140_1.dll,于是查找到该文件:
拷贝到win7,运行:
终于可以运行,正常输出结果了!!!
4.总结
1.在windows发布程序,一定要在一个干净的环境下去测试程序是否能运行,比如win7,如果在干净的win7能运行,那基本上在win7之后的版本应该都能运行。
2.查找程序依赖,vs2022编译出来的程序,依赖的库一般都去vs2022的安装目录里面去找,会比较快。
3.好好的利用Everything工具,用它查找真是快。
相关链接
- CMake 官网 https://cmake.org/
- CMake 官方文档:https://cmake.org/cmake/help/latest/guide/tutorial/index.html
- CMake 源码:https://github.com/Kitware/CMake
- CMake 源码 : CMake · GitLab
- 中文版基础介绍: CMake 入门实战 | HaHack
- wiki: Home · Wiki · CMake / Community · GitLab