vs2019 - 打包(开发机win10x64 - 目标机win7x64 - debug版程序)

news2024/10/5 18:52:32

文章目录

    • vs2019 - 打包(开发机win10x64 - 目标机win7x64 - debug版程序)
    • 概述
    • 笔记
    • 添加组件
    • 添加程序集
    • 删掉组件时,支持多选
    • 加入全部组件后,需要删除的组件如下
    • 删掉有依赖的组件
    • 去掉有依赖的组件后,编译结果有很明显的区别
    • VS2019打包工程确实有bug
      • mfc140ud.dll需要的组件
      • VCRUNTIME140D.dll需要的组件
      • ucrtbased.dll需要的组件
    • 最终下载的win7x64 ucrt补丁一共有3个
    • 需要添加自己应用缺的dll
    • 在自己应用中补充缺少的vs2019DLL
      • 补充缺少的vs2019DLL的本地来源
    • 建立打包工程
    • 给安装后的目录添加子文件夹
    • 给安装后的目录中添加文件
      • 给安装后目录的子目录中添加文件
    • 可以在目标计算机添加更多位置的文件夹
    • 添加应用的快捷方式
    • 给安装程序添加组件
    • 设置工程安装的选项
    • 修改默认安装路径
    • 用户桌面文件夹的总是建立要选为true
    • 修改版本号后,最好将产品代码的GUID也更新一下
    • 备注 - ucrt
    • 备注
    • 备注 - 使用体验
    • END

vs2019 - 打包(开发机win10x64 - 目标机win7x64 - debug版程序)

概述

一般打包时,需要将工程输出都编译成release版。
但是我想先试试debug版,做个debug版的安装包。安装到测试机上,如果有问题,可以看到debug版的断言。

用vs2019setup工程默认打包后的安装包,因为只有自己应用相关的文件,到新的测试环境后,是无法正常运行的。e.g. 刚安装完的win7x64旗舰版。
运行自己的应用,总会少vs2019自己的dll.
在这里插入图片描述
这时,应该在setup工程中添加vs2019自己的组件,保证自己应用的vs2019环境是全的。重新打个包。

笔记

添加组件

在这里插入图片描述
在这里插入图片描述
如果不知道应该安装哪个vs2019组件,就全选。
因为是无脑的选择,有些组件无法引入setup工程,有报错。

ERROR: Unable to import merge module 'C:\Program Files (x86)\Common Files\Merge Modules\niWininet.msm'
WARNING: Error merging 'MDAC.MSM': Unable to merge data from the merge module because it conflicts with existing data in the package.
MergeModule: table='File' row='adcvbs.inc'
Database: table='File' row='adcvbs.inc'
WARNING: Error merging 'MDAC.MSM': Unable to merge data from the merge module because it conflicts with existing data in the package.
MergeModule: table='File' row='odbc32gt.dll'
Database: table='File' row='odbc32gt.dll'
Database: table='File' row='adcjavas.inc'
ERROR: Unable to import merge module 'C:\Program Files (x86)\Common Files\Merge Modules\nidcom95.msm'
Build process cancelled
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0==========

将这些错误的组件从setup工程移除。再打包。
移除的组件如下:

niWininet.msm
MDAC.MSM
nidcom95.msm

移除不能引入的组件后,打包成功

Packaging file 'POLICY~7.DLL'...
Packaging file 'mfc140d.dll'...
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0==========

但是有些警告如下:

已启动重新生成…
------ Starting pre-build validation for project 'caseSetupPrj' ------ 
WARNING: Unable to find module dependency with signature 'OpenGL32.09188572_BCB5_11D3_AB7C_006008CA11D7'
WARNING: Unable to find module dependency with signature 'MSVCRT.51D569E0_8A28_11D2_B962_006097C4DE24'
// ...
------ Pre-build validation for project 'caseSetupPrj' completed ------
------ 已启动全部重新生成: 项目: caseSetupPrj, 配置: Debug ------
Building file 'D:\my_dev\my_local_git_prj\xx\src\installer\caseSetupPrj\Debug\caseSetupPrj.msi'...
WARNING: Two or more objects have the same target location ('[payload_ul]\8.0.50727.5592.policy')
WARNING: Two or more objects have the same target location ('[payload_ul]\8.0.50727.5592.policy')

这些警告咱不懂啊,不管了。
试试添加vs2019组件后,重新打包的安装程序在新环境计算机上是否好使?
在这里插入图片描述
可以看到加了vs2019组件的安装包比没加组件的安装包大了大概50MB.
尝试安装
在这里插入图片描述
安装程序本身需要.net4.7.2了…
我的应用没用这玩应啊…, 估计是选的那些vs2019组件需要dotnet472.
点击是,得到.net4.7.2的下载链接 http://go.microsoft.com/fwlink/?LinkId=863262
是在线版安装包,这不行啊。
在网上找到了离线版安装包 https://go.microsoft.com/fwlink/?linkid=863265
先下载(ndp472-kb4054530-x86-x64-allos-enu.exe 大概80MB),然后尝试是否可以打在VS2019的setup工程中。

添加程序集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打包完成,发现比打了组件的安装包,又大了170MB.
尝试安装运行。

在这里插入图片描述
安装程序还是需要dotnet472, 无法将dotnet472打在安装包中。
那提供2个安装包包吧,一个是MS原版的.net472安装包,一个是自己打了vs2019组件的安装包。
在这里插入图片描述
先安装.net472, 发现win7不支持.net472.
那就不能安装那么多vs2019组件了,需要将多余组件去掉才行。只保留自己应用相关的组件。
在这里插入图片描述
在setup工程中,看到安装程序是依赖.net的。尝试去掉多余的组件,看看是否还需要.net
将组件从setup工程中都删除了,就没有.net依赖了。
在这里插入图片描述
那再全加上,慢慢删掉组件,看删到那个组件,显示不需要.net环境?
在这里插入图片描述
安装包本身需要的依赖项,可以在依赖项文件夹上右击"刷新依赖项"来查看。
通过实现发现,依赖项是可以实时更新的,如果删掉哪个组件,导致安装程序不需要依赖.net了,马上就能显示。
在这里插入图片描述
删掉Microsoft_VC80_CRT_x86.msm后,显示安装程序需要Microsoft_VC80_CRT_x86.msm.

删掉MStudioCommon.2005.msm后,就不需要Microsoft_VC80_CRT_x86.msm了。
在这里插入图片描述
删掉MStudioCommon.msm后,就不需要.net支持了。
现在有点明白了,MStudioCommon.msm和MStudioCommon.2005.msm可能是写VS2019插件DLL才要的组件。
现在知道了,将组件全部去掉,再重新加入,将MStudioCommon.msm和MStudioCommon.2005.msm拿掉,再打个包试试。

删掉组件时,支持多选

在这里插入图片描述
一个一个删除setup工程中的参与编译项,太麻烦了,试了,可以多选,然后按delete键一次性移除。

加入全部组件后,需要删除的组件如下

niWininet.msm
MDAC.MSM
nidcom95.msm
MStudioCommon.2005.msm
MStudioCommon.msm

在这里插入图片描述
现在打包完,仅仅比没加组件的打包版本大50MB.
试试。
在这里插入图片描述
安装程序还需要.net?
重新启动虚拟机再试试。
安装程序还需要.net.
那就得在setup工程中,再删掉可能需要.net的组件。

删掉有依赖的组件

在这里插入图片描述
先尝试将还需要依赖的组件拿掉。
在这里插入图片描述
如果加入的组件不依赖其他组件,就留在setup工程中。
再尝试打包。

去掉有依赖的组件后,编译结果有很明显的区别

已启动重新生成…
------ Starting pre-build validation for project 'caseSetupPrj' ------ 
------ Pre-build validation for project 'caseSetupPrj' completed ------
------ 已启动全部重新生成: 项目: caseSetupPrj, 配置: Debug ------
Building file 'D:\my_dev\my_local_git_prj\xx\src\installer\caseSetupPrj\Debug\caseSetupPrj.msi'...
WARNING: Two or more objects have the same target location ('[payload_ul]\8.0.50727.5592.cat')
WARNING: Two or more objects have the same target location ('[payload_ul]\8.0.50727.5592.cat')
// 上述警告说安装位置一样,这不是问题(重复安装就重复安装)
Packaging file 'z2yaprdo.dll'...
Packaging file 'xx.dll'...
// ...
Packaging file '3xubcbxg.etb'...
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0==========

这次编译结果,没有了另外一个警告 WARNING: Unable to find module dependency with signature ‘OpenGL32.09188572_BCB5_11D3_AB7C_006008CA11D7’

看着像打包没问题了,再试试。
在这里插入图片描述
这次只加没依赖的组件,比只加自己应用的版本大40MB
在这里插入图片描述

居然还需要.net472…
是不是虚拟机缓存文件的问题? 尝试将setup工程改名,将GUID的值换了,再试试。
还是需要.net472, 不是安装程序缓存的问题。

那只能再尝试删掉一些组件,再打包试试。

一个一个删除,然后打包,不行,安装程序需要.net472.
直到删掉最后一个组件,已经和开始新建工程一样了,打包后还是需要.net472.
这不科学啊,估计是打包工程有bug.

重新建立一个工程,先添加自己应用的文件,打包试试。
然后再添加必要的组件,打包再试试。

VS2019打包工程确实有bug

如果加入了组件,即使将组件移除,如果这个组件原来依赖.net. 移除之后,setup工程打包后的安装程序还是需要.net.
必须在工程中新加入自己需要的组件才行,只要一加入,这个组件就会被打包好的setup程序用上。
所以要保证组件在一个工程中,只能新加入一次。
如果组件加错了,要重新在新建的setup工程中重新加入,而不能在旧工程中改。

mfc140ud.dll需要的组件

如果程序运行时,缺少mfc140ud.dll, 添加组件 Microsoft_VC140_DebugMFC_x64.msm 就好了。
在这里插入图片描述
在这里插入图片描述

VCRUNTIME140D.dll需要的组件

如果缺VCRUNTIME140D.dll, 加入Microsoft_VC140_DebugCRT_x64.msm

在这里插入图片描述
在这里插入图片描述

ucrtbased.dll需要的组件

在这里插入图片描述
https://www.microsoft.com/en-us/download/details.aspx?id=49093

https://www.microsoft.com/zh-cn/download/details.aspx?id=49093
在这里插入图片描述
ucrtbased.dll是系统的补丁,需要windows升级才行。
对于win7,需要安装KB2999226补丁
这个补丁必须在win7Sp1上才行,原版的win7不行(win7x64旗舰版 - 6.1.7600)
看来我用(win7x64旗舰版 - 6.1.7600)时,vmware安装vmtools时要求更新到win7sp1是有道理的…

最终下载的win7x64 ucrt补丁一共有3个

windows6.1-kb2533552-x64_0ba5ac38d4e1c9588a1e53ad390d23c1e4ecd04d.msu
windows6.1-kb976932-x64_74865ef2562006e51d7f9333b4a8d45b7a749dab.exe
Windows6.1-KB2999226-x64.msu
安装次序如上。
windows6.1-kb2533552-x64_0ba5ac38d4e1c9588a1e53ad390d23c1e4ecd04d.msu 和 windows6.1-kb976932-x64_74865ef2562006e51d7f9333b4a8d45b7a749dab.exe 是给win7x64原版升级到win7sp1x64

Windows6.1-KB2999226-x64.msu 是在win7sp1x64基础上,添加ucrt库。

需要添加自己应用缺的dll

上面添加的.msm一共5个如下:

microsoft_vc140_crt_x64.msm
Microsoft_VC140_DebugCRT_x64.msm
Microsoft_VC140_DebugMFC_x64.msm
MIcrosoft_VC140_MFC_x64.msm
MSVCRT.msm

这些.msm会向目标机的C:\Windows\System32\中拷贝VS2019的基础dll
自己手工拷贝这些vs2019的基础dll到自己工程,很麻烦,不靠谱。 还是用打包添加组件的方式来的方便靠谱。

在自己应用中补充缺少的vs2019DLL

在上述打包基础上,根据提示,缺哪个DLL就补充哪个DLL.
补充的DLL从在自己开发机上找,都在VS2019的安装目录和windows SDK的安装目录中。
补充的DLL如下:

concrt140d.dll
msvcp140_1d.dll
msvcp140_2d.dll
msvcp140d.dll
msvcp140d_atomic_wait.dll
msvcp140d_codecvt_ids.dll
ucrtbased.dll
vccorlib140d.dll
vcruntime140.dll
vcruntime140_1d.dll
vcruntime140d.dll

补充缺少的vs2019DLL的本地来源

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Redist\MSVC\14.29.30133\debug_nonredist\x64\Microsoft.VC142.DebugCRT

concrt140d.dll
msvcp140_1d.dll
msvcp140_2d.dll
msvcp140d.dll
msvcp140d_atomic_wait.dll
msvcp140d_codecvt_ids.dll
vccorlib140d.dll
vcruntime140_1d.dll
vcruntime140d.dll
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Redist\MSVC\14.29.30133\x64\Microsoft.VC142.CRT
vcruntime140.dll

C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.UniversalCRT.Debug\10.0.22000.0\Redist\Debug\x64

ucrtbased.dll

建立打包工程

在这里插入图片描述
在这里插入图片描述

给安装后的目录添加子文件夹

如果应用需要子文件夹中的东西,可能由于权限问题,无法在目标机上建立子文件夹。
这时,在安装程序中就预先建立好,这个主意好。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

给安装后的目录中添加文件

在这里插入图片描述
在这里插入图片描述
添加文件时,如果提示有组件中包含这些文件,是否添加组件,选择否。
组件另外添加。
操作完成时,可以看到在目标机的应用文件夹中,就有我们添加的安装后的文件了。
在这里插入图片描述

给安装后目录的子目录中添加文件

和"给安装后的目录中添加文件"操作步骤一样,只不过需要在添加的子文件夹上右击,选择添加文件。

可以在目标计算机添加更多位置的文件夹

在这里插入图片描述

添加应用的快捷方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
改快捷方式的图标
在这里插入图片描述

给安装程序添加组件

在这里插入图片描述
根据自己应用的实际需要添加必要的组件,对于本实验(VS2019 + MFC + X64), 添加一下5个组件。

microsoft_vc140_crt_x64.msm
Microsoft_VC140_DebugCRT_x64.msm
Microsoft_VC140_DebugMFC_x64.msm
MIcrosoft_VC140_MFC_x64.msm
MSVCRT.msm

设置工程安装的选项

为所有用户安装
安装前,自动卸载旧版本。
在这里插入图片描述

修改默认安装路径

e.g. 想将程序安装到一个英文路径且没有空格的目录。
在这里插入图片描述

用户桌面文件夹的总是建立要选为true

不知道是不是我自己改成false的,重新生成时有报错提示,要将桌面文件夹的“总是创建”改为true才行。
在这里插入图片描述

修改版本号后,最好将产品代码的GUID也更新一下

在这里插入图片描述

备注 - ucrt

ucrt是同一运行时库,是作为OS的一部分内建组件。无法包含在安装包内。VS2019是这样。
如果自己做的安装包报错为 api_x.dll没找到之类的,就是系统需要打ucrt的升级补丁(对于win7原版来说,就要升级到win7sp1 + win7x64的ucrt的补丁)

备注

上述打包过程正确,可以生成想要的x64安装包。
已经试过了,安装后好使。
如果要打release版的包,区别:

  • 将工程输出都搞成release版
  • 添加release版的组件

备注 - 使用体验

用VS2019的setup工程添加组件挺方便的。
VS2019的setup工程基本功能都有,只要用了第一遍,估计就不想换其他第三方的安装制作程序了。
和微软家出的其他产品一样,只要不想做太精致的东西(能用(功能性的特性都在),但是不好看),就微软家自带的就行。

END

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

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

相关文章

【教学类-58-02】黑白三角拼图02(3*3宫格)262144种

背景需求: 已知黑白三角拼图2*2(4个拼图)一共有256种排列方法 【教学类-58-01】黑白三角拼图01(2*2宫格)256种-CSDN博客文章浏览阅读142次,点赞5次,收藏12次。【教学类-58-01】黑白三角拼图01…

【qt】初识模型和视图

模型和视图 一.模型和视图的概念1.关系2.模型3.数据4.视图5.特点 二.文件系统模型1.那种数据?2.界面拖放3.创建模型4.模型设置数据5.视图设置模型6.模型索引7.模型操作数据①文件名②文件大小③文件类型④是否是目录⑤文件路径 三.字符串链表模型1.那种数据&#xf…

自动化您的任务——crewAI 初学者教程

今天,我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息:crewAI。 我将在这里或那里跳过一些内容,使本教程成为一个精炼的教程,概述帮助您入门的关键概念和要点 今天,我写这篇文章是为了…

云计算期末复习(1)

云计算基础 作业(问答题) (1)总结云计算的特点。 透明的云端计算服务 “无限”多的计算资源,提供强大的计算能力 按需分配,弹性伸缩,取用方便,成本低廉资源共享,降低企…

一位老网工19年前写下的话,激励无数网工人

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 中午好,我是老杨。 2005年的互联网没有如今这么发达,但2005年,有一个技术人写了一段话,感动了无数…

LoadBalancer

一、手写随机负载均衡 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><!--引入nacos discovery--> <dependency><groupId>com…

vue列表数据添加和删除实例

运行效果如下&#xff1a; 详细代码&#xff1a; 自行添加vue.min.js文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&…

光耦合器的特性和应用概述

光耦合器又称光电耦合器&#xff0c;是现代电子学中必不可少的元件&#xff0c;确保隔离电路之间安全有效的信号传输。本文探讨了光耦合器的特性及其多样化应用&#xff0c;强调了它们在各种电子系统中的关键作用。 什么是光耦合器&#xff1f; 光耦合器是一种设计用于利用光传…

SpringCloud Alibaba详解:打造高可用的分布式系统

SpringCloud Alibaba是一个基于Spring Cloud的微服务开发框架&#xff0c;它集成了阿里巴巴的一系列中间件和工具&#xff0c;能够快速构建高可用的分布式系统。在本文中&#xff0c;将详细介绍如何使用SpringCloud Alibaba来打造高可用的分布式系统&#xff0c;并通过代码案例…

SAP-FICO-凭证编号控制

成本凭证编号KANK 如果自己的公司下没有&#xff0c;直接复制系统原有的就可以。使用系统默认即可。 如果不维护 会报错“CO-凭证编号分配对于成本控制范围****中的商业事务COIN无效” 财务凭证编号FBN1 可以用OBH2批量复制编号范围。 物料账期MMPV 财务账期OB52

TCP—三次握手和四次挥手

目录 一、三次握手和四次挥手的目的 二、TCP可靠的方面 三、什么是三次握手 四、第三次握手的目的 五、什么是四次挥手 六、超时时间的目的 七、SYN包、ACK包、FIN包 八、解决丢包和乱序 九、参考资料 一、三次握手和四次挥手的目的 TCP三次握手的目的主要是为了确保两…

国产AI服务器Tr i - M o d e R A I D 卡,Tri-Mode HBA卡,SAS RAID卡

技术规格 • 主机接口&#xff1a;PCIe 4.0 x8 • 数据接口&#xff1a;SATA/SAS/PCIe三模 • 连接器&#xff1a;2x8 SFF-8654&#xff0c;2x M-Key M.2(2280) • 控制器&#xff1a;IOC 2250 • 硬盘数量&#xff1a;16 2 块SATA/SAS/PCIe • RAID模式&#xff1a;RAID…

蓝牙模块在无人机 ID识别、标准制定发挥的作用及其应用优势和面临的挑战

随着科技的飞速发展&#xff0c;无人机已经广泛应用于航拍、农业、救援、物流等多个领域。而在无人机的通信与控制系统中&#xff0c;蓝牙模块扮演着重要的角色。本文将探讨蓝牙模块在无人机Remote ID识别和标准制定执行中发挥的作用&#xff0c;并分析其应用优势和面临的挑战。…

mysql-索引、存储引擎、事务、锁机制和优化

1. MySQL的索引 1.1 概述 索引是通过某种算法&#xff0c;构建出一个数据模型&#xff0c;用于快速找出在某个列中有以特定值的行&#xff0c;不使用索引&#xff0c;MySQL必须从一条记录开始读完整个表&#xff0c;直到找出相关的行&#xff0c;表越大查询数据所花的时间越多…

【全部更新完毕】2024长三角数学建模A题思路代码文章教学-“抢救”落水手机

文章摘要部分&#xff1a; “抢救”落水手机 摘要 文章主要探讨了如何科学地处理和搜索在水体中意外掉落的物品&#xff1a;华为 Mate 60 Pro手机和居民身份证。本文基于物理模型和动力学分析&#xff0c;为不同水体环境中的掉落物品提供了详尽的搜索策略和打捞建议。 本文…

C++ | Leetcode C++题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; class Solution { public:bool check(TreeNode *u, TreeNode *v) {queue <TreeNode*> q;q.push(u); q.push(v);while (!q.empty()) {u q.front(); q.pop();v q.front(); q.pop();if (!u && !v) continue;if ((!u || !v) ||…

碳课堂|ISO 14067 产品碳足迹国际标准

为规范评估产品碳排放&#xff0c;国际标准化组织发布了《ISO14067&#xff1a;2018温室气体-产品碳足迹-量化要求及指南》&#xff0c;标准量化产品生命周期阶段&#xff08;包括从资源开采、原材料采购到产品的生产、使用和报废阶段&#xff09;的温室气体排放的通用标准。该…

java项目之桂林旅游景点导游平台源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的桂林旅游景点导游平台。 项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 桂林旅游景点导游…

腾讯TDSQL-C灰度发布列存索引; Azure Copilot集成支持Azure上各种托管数据库;

重要更新 1. Copilot for Azure新增了对Azure SQL、 Azure Database for MySQL的支持([8] [14])。Copilot for Azure是微软云提供的基于大模型技术的助手工具&#xff0c;主要能力包括了&#xff1a;该大模型可以获得最新的文档&#xff0c;以及客户的Azure资源情况&#xff0c…