CMake实践: 以开源库QSimpleUpdater为例,详细讲解编译、查找依赖等全过程

目录

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。主要功能包括:

  1. 查看文件头信息:包含 PE 文件结构、子系统、DLL 特性等
  2. 分析导出表:列出 DLL 中导出的函数和变量
  3. 分析导入表:显示程序依赖的外部函数和 DLL
  4. 依赖分析:检查二进制文件依赖的所有动态链接库
  5. 符号表查看:显示 COFF 符号表信息,用于调试和链接分析
  6. 资源查看:查看二进制文件中包含的资源(图标、菜单、字符串等)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/87090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordToCard制作高考志愿填报攻略小卡片【豆包版】

一、什么是WordToCard WordToCard是一个免费的工具,能够将Word文档自动转换为美观的知识卡片或图文海报。以下是它的主要特点: 功能优势 格式支持:支持标题、列表、表格、LaTeX公式等多种格式。模板丰富:提供多种风格的模板&am…

什么是PostCSS

PostCSS是一个用 JavaScript 工具和插件转换 CSS 代码的工具 PostCSS是基于 JavaScript 的 CSS 转换引擎,通过插件系统对 CSS 进行现代化处理,PostCSS 不是预处理器,而是 CSS 的编译器工具链,如同 Babel 之于 JavaScript&#xf…

游戏引擎学习第315天:取消排序键的反向顺序

仓库:https://gitee.com/mrxiao_com/2d_game_8 必须保证代码能跟上不然调试很麻烦 回顾并为今天定调 目前正处于对引擎中 Z 轴处理方式进行修改的阶段。上次我们暂停在一个节点,当时我们希望不再让所有屏幕上的精灵都必须通过同一个排序路径进行排序。我们想要将…

MySQL EXPLAIN 详解

MySQL EXPLAIN 详解:掌握 SQL 性能优化的关键工具 在日常数据库开发和优化过程中,很多开发者会遇到 SQL 查询变慢、索引未命中等问题。MySQL 提供了一个非常实用的工具 —— EXPLAIN 关键字,它可以帮助我们分析 SQL 查询的执行计划,识别潜在的性能瓶颈,从而有针对性地进行…

k8s使用私有harbor镜像源

前言 在node上手动执行命令可以正常从harbor拉取镜像,但是用k8s不行,使用kubectl describe pods xxx 提示未授权 unauthorized to access repository。 处理方法 创建一个secrete资源对象。以下示例中 registry-harbor 为secret资源对象的名称。除了邮…

AI绘画能发展到企业大规模使用的地步么?

1 技术演进与当前成熟度 AI绘画技术经历了从实验室概念到商业级工具的蜕变过程。早期技术受限于模型坍缩等问题,难以满足商业需求。关键突破出现在新型生成模型的应用,大幅提升生成速度至30秒内,在画面逻辑性和风格多样性方面实现质的飞跃。…

使用MyBatis-Plus实现数据权限功能

什么是数据权限 数据权限是指系统根据用户的角色、职位或其他属性,控制用户能够访问的数据范围。与传统的功能权限(菜单、按钮权限)不同,数据权限关注的是数据行级别的访问控制。 常见的数据权限控制方式包括: 部门数…

大模型——Dify 与 Browser-use 结合使用

大模型——Dify 与 Browser-use 结合使用 Dify 与 Browser-use 的结合使用,能够通过 AI 决策与自动化交互的协同,构建智能化、场景化的业务流程。 以下是两者的整合思路与技术落地方案: 一、核心组合逻辑 分工定位 Dify:作为AI模型调度中枢,负责自然语言理解、决策生成、…

transformer demo

import torch import torch.nn as nn import torch.nn.functional as F import math import numpy as np import pytestclass PositionalEncoding(nn.Module):def __init__(self, d_model, max_seq_length5000):super(PositionalEncoding, self).__init__()# 创建位置编码矩阵p…

centos 8.3(阿里云服务器)mariadb由系统自带版本(10.3)升级到10.6

1. 备份数据库 在进行任何升级操作前,务必备份所有数据库: mysqldump -u root -p --all-databases > all_databases_backup.sql # 或者为每个重要数据库单独备份 mysqldump -u root -p db_name1 > db_name1_backup.sql mysqldump -u root -p db…

如何稳定地更新你的大模型知识(算法篇)

目录 在线强化学习的稳定知识获取机制:算法优化与数据策略一、算法层面的稳定性控制机制二、数据处理策略的稳定性保障三、训练过程中的渐进式优化策略四、环境设计与反馈机制的稳定性影响五、稳定性保障的综合应用策略六、总结与展望通过强化学习来让大模型学习高层语义知识,…

图的遍历模板

图的遍历 BFS 求距离 #include<bits/stdc.h>using namespace std;int n, m, k,q[20001],dist[20001]; vector<int> edge[20001];int main(){scanf("%d%d%d",&n,&m,&k);for (int i 1;i<m;i){int x,y;scanf("%d%d",&x,&am…

Java集合 - LinkedList底层源码解析

以下是基于 JDK 8 的 LinkedList 深度源码解析&#xff0c;涵盖其数据结构、核心方法实现、性能特点及使用场景。我们从 类结构、Node节点、插入/删除/访问操作、线程安全、性能对比 等角度进行详细分析 一、类结构与继承关系 1. 类定义 public class LinkedList<E> e…

Pytorch 卷积神经网络参数说明一

系列文章目录 文章目录 系列文章目录前言一、卷积层的定义1.常见的卷积操作2. 感受野3. 如何理解参数量和计算量4.如何减少计算量和参数量 二、神经网络结构&#xff1a;有些层前面文章说过&#xff0c;不全讲1. 池化层&#xff08;下采样&#xff09;2. 上采样3. 激活层、BN层…

C++ 中的 iostream 库:cin/cout 基本用法

iostream 是 C 标准库中用于输入输出操作的核心库&#xff0c;它基于面向对象的设计&#xff0c;提供了比 C 语言的 stdio.h 更强大、更安全的 I/O 功能。下面详细介绍 iostream 库中最常用的输入输出工具&#xff1a;cin 和 cout。 一、 基本概念 iostream 库&#xff1a;包…

SAP复制一个自定义移动类型

SAP复制移动类型 在SAP系统中&#xff0c;复制移动类型201可以通过事务码OMJJ或SPRO路径完成&#xff0c;用于创建自定义的移动类型以满足特定业务需求。 示例操作步骤 进入OMJJ事务码&#xff1a; 打开事务码OMJJ&#xff0c;选择“移动类型”选项。 复制移动类型&#xff…

Bambu Studio 中的“回抽“与“装填回抽“的区别

回抽 装填回抽: Bambu Studio 中的“回抽” (Retraction) 和“装填回抽”(Prime/Retract) 是两个不同的概念&#xff0c;它们都与材料挤出机的操作过程相关&#xff0c;但作用和触发条件有所不同。 回抽(Retraction): 回抽的作用, 在打印机移动到另一个位置之前&#xff0c;将…

危化品安全监测数据分析挖掘范式:从被动响应到战略引擎的升维之路

在危化品生产的复杂生态系统中,安全不仅仅是合规性要求,更是企业生存和发展的生命线。传统危化品安全生产风险监测预警系统虽然提供了基础保障,但其“事后响应”和“单点预警”的局限性日益凸显。我们正处在一个由大数据、人工智能、数字孪生和物联网技术驱动的范式变革前沿…

C++ RPC 远程过程调用详细解析

一、RPC 基本原理 RPC (Remote Procedure Call) 是一种允许程序调用另一台计算机上子程序的协议,而不需要程序员显式编码这个远程交互细节。其核心思想是使远程调用看起来像本地调用一样。 RPC 工作流程 客户端调用:客户端调用本地存根(stub)方法参数序列化:客户端存根将参…

Python:操作 Excel 预设色

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…