当前位置: 首页 > article >正文

告别DLL缺失!用VS2019的Setup Project打包C++程序,保姆级配置指南

告别DLL缺失用VS2019的Setup Project打包C程序保姆级配置指南在C开发中最令人头疼的问题之一莫过于程序在其他电脑上运行时出现DLL缺失的错误。这种问题不仅影响用户体验也让开发者陷入反复调试的困境。本文将带你从根源上解决这一难题通过Visual Studio 2019的Setup Project功能实现一键打包所有依赖让你的C程序在任何Windows电脑上都能顺畅运行。1. 理解DLL依赖问题的本质DLL动态链接库是Windows系统中常见的共享库文件格式。当你的程序使用动态链接方式编译时运行时需要这些DLL文件才能正常工作。常见的缺失问题通常源于以下几种情况运行时库依赖如MSVCR120.dll、VCRUNTIME140.dll等第三方库依赖如OpenCV、Qt等框架的DLL系统组件依赖如DirectX、.NET Framework等为什么选择静态链接通过将运行库静态链接到你的程序中可以避免最常见的MSVC运行时DLL依赖问题。VS2019提供了几种运行库选项运行库选项含义适用场景/MT多线程静态链接发布版本/MTd多线程静态调试链接调试版本/MD多线程动态链接发布版本/MDd多线程动态调试链接调试版本提示选择/MT或/MTd可以将C运行时库静态链接到你的程序中减少外部依赖。2. 配置项目属性避免DLL缺失在开始打包前我们需要确保项目配置正确从源头上减少DLL依赖问题。2.1 修改运行库设置右键点击你的项目选择属性导航到配置属性 → C/C → 代码生成在运行库下拉菜单中选择/MT发布版本或/MTd调试版本点击应用保存设置// 示例检查当前运行库设置 #if defined(_DEBUG) #pragma message(使用调试运行库) #else #pragma message(使用发布运行库) #endif2.2 处理第三方库依赖即使设置了静态链接第三方库可能仍需要额外的DLL。处理这些依赖的方法包括使用静态库版本.lib文件而非动态库版本.dll文件将必要的DLL包含在安装包中在代码中动态加载库LoadLibrary方式3. 安装和配置VS2019 Installer Projects插件Visual Studio 2019默认不再包含安装项目模板需要手动安装扩展。3.1 安装步骤打开VS2019点击扩展 → 管理扩展在搜索框中输入Installer Projects找到Microsoft Visual Studio Installer Projects并点击下载安装完成后重启VS20193.2 验证安装安装成功后你可以在新建项目对话框中搜索到以下模板Setup ProjectSetup WizardMerge Module ProjectCAB Project4. 创建和配置Setup Project现在我们可以开始创建安装项目将程序及其依赖打包成一个标准的Windows安装程序。4.1 添加Setup Project到解决方案右键解决方案 → 添加 → 新建项目搜索Setup Project并选择命名项目如MyAppInstaller并创建4.2 添加项目输出右键安装项目 → 添加 → 项目输出选择你的主项目在列表中选择主输出并确定4.3 添加额外文件对于必须包含的DLL或其他资源文件# 示例查找项目依赖的DLL dumpbin /DEPENDENTS MyApp.exe右键安装项目 → 添加 → 文件浏览并选择需要包含的DLL文件设置文件的安装属性如永久删除、注册等5. 创建桌面快捷方式和卸载程序完善的安装包应该提供便捷的访问方式和卸载功能。5.1 添加快捷方式在安装项目的文件系统视图中右键主输出选择创建快捷方式将快捷方式拖到用户的程序菜单或用户桌面文件夹重命名快捷方式如MyApp5.2 添加卸载功能右键安装项目 → 添加 → 文件浏览到C:\Windows\System32\msiexec.exe创建快捷方式并重命名为卸载MyApp在属性窗口中设置Arguments为/x [ProductCode]注意ProductCode可以在安装项目的属性窗口中找到。6. 构建和测试安装包完成配置后就可以生成安装包并进行测试了。6.1 生成安装包右键安装项目 → 生成在输出目录中找到生成的.msi和setup.exe文件6.2 测试安装在干净的测试机器上运行安装程序验证程序是否能正常运行测试卸载功能是否完整清除程序常见问题排查如果仍出现DLL缺失使用Dependency Walker工具分析依赖检查是否所有必要的DLL都包含在安装包中确认运行库设置是否正确7. 高级配置技巧为了让你的安装包更加专业可以考虑以下高级配置7.1 自定义安装界面右键安装项目 → 视图 → 用户界面添加/删除安装步骤自定义欢迎文本、许可协议等7.2 注册表设置右键安装项目 → 视图 → 注册表添加必要的注册表键值设置安装时写入的注册表信息7.3 自定义操作右键安装项目 → 视图 → 自定义操作添加安装/卸载时执行的脚本或程序设置执行条件和顺序在实际项目中我发现最稳妥的做法是在虚拟机中测试安装包模拟真实的用户环境。特别是对于依赖复杂的程序这种方法能有效发现潜在问题。另外记得在项目文档中记录所有外部依赖便于后续维护和更新。

相关文章:

告别DLL缺失!用VS2019的Setup Project打包C++程序,保姆级配置指南

告别DLL缺失!用VS2019的Setup Project打包C程序,保姆级配置指南 在C开发中,最令人头疼的问题之一莫过于程序在其他电脑上运行时出现"DLL缺失"的错误。这种问题不仅影响用户体验,也让开发者陷入反复调试的困境。本文将带…...

从ARM Cortex-M到FPGA:手把手教你用AXI4-Lite搭建自定义外设(以Zynq-7000为例)

从ARM Cortex-M到FPGA:用AXI4-Lite实现自定义外设的工程实践 在嵌入式系统开发中,处理器与可编程逻辑的高效协同一直是提升性能的关键路径。当标准外设无法满足特定需求时,工程师往往需要在FPGA中设计定制硬件模块,并通过标准化总…...

别再只会写脚本了!用MATLAB面向对象编程重构你的数据处理流程(附完整Point2D类示例)

从脚本到对象:MATLAB面向对象编程的工程化实践 在科研与工程计算领域,MATLAB长期占据着不可替代的地位。然而,许多用户在使用多年后,依然停留在编写线性脚本的阶段,导致代码库逐渐演变成难以维护的"意大利面条式代…...

告别手动评分!用ImageJ的IHC Profiler插件,5分钟搞定免疫组化定量分析(附避坑指南)

告别手动评分!用ImageJ的IHC Profiler插件,5分钟搞定免疫组化定量分析(附避坑指南) 免疫组化(IHC)作为病理诊断和生物医学研究中的金标准技术,其结果的量化分析一直是困扰研究人员的难题。传统人…...

DeepSeek LeetCode 2503.矩阵查询可获得的最大分数 Go实现

以下是 LeetCode 2503 的 Go 实现,使用优先队列 排序 离线查询的思路:go import ("container/heap""sort" )type Cell struct {val intr intc int }// 最小堆实现 type MinHeap []Cellfunc (h MinHeap) Len() int {…...

IT6520:USB‑C 转 MIPI 芯片方案 4K@120Hz 高清显示

一、前言平板、便携屏、AR/VR 头显、车载中控、会议终端等设备,对USB‑C 一线通视频输出的需求越来越强。 传统方案必须用:PD 控制器 DP 接收芯片 MIPI 桥接芯片 外置 MCU Flash,多芯片拼凑导致电路复杂、成本高、兼容性差、开发周期长。…...

One API 部署教程(下):使用指南

导读:前面两篇讲了本地和线上部署,现在 One API 已经跑起来了,接下来就是真正的使用环节! 理解核心概念 在开始之前,咱们先搞清楚几个关键概念,不然后面容易晕。 渠道(Channel):就是你的各个 AI 平台的 API Key。比如你有 DeepSeek 的 Key、OpenAI 的 Key、通义千问…...

我的第一个CANOpen主站:手把手教你用CanFestival-3源码配置心跳、SYNC和PDO映射

我的第一个CANOpen主站:手把手教你用CanFestival-3源码配置心跳、SYNC和PDO映射 当你第一次面对工业现场总线协议时,那种既兴奋又忐忑的心情我至今记忆犹新。CANOpen作为工业自动化领域的"普通话",其主站开发往往是工程师进阶路上的…...

UE5新手也能搞定的Niagara特效:用模板10分钟做出一个会动的烟雾

UE5 Niagara特效速成:10分钟打造动态烟雾的极简指南 第一次打开Unreal Engine的Niagara特效系统时,我被密密麻麻的节点和参数吓退了三次。直到发现模板库里的"Simple Sprite Burst",才意识到原来制作专业级特效可以如此简单——就像…...

【设计模式 09】桥接:两条路各走各的

这一课讲桥接模式。什么在变:多个维度各自独立变化,绑在一起会组合爆炸。怎么挡:拆成独立体系,用组合连接,各自扩展互不影响。陈敏把组织架构图展开在会议桌上的时候,在场所有人都看到了问题。 产品线三条&…...

Vibe Coding 工具选型决策树:5 类项目场景对应 7 种组合配置方案

1. 项目概述:为什么“选对组合”比“选对单个工具”更重要 大多数人第一次听说 vibe coding,是在看到某位工程师用 Cursor 写完一个 Vue3 表单组件只花了 90 秒,或者用 Claude Code 在 VS Code 里补全了整套 Express 路由逻辑后脱口而出的那句“这哪是写代码,这是调 API”…...

电弧故障检测与定位片上系统【附程序】

✨ 长期致力于电弧故障采集、电弧故障检测、电弧故障定位、片上系统、全数字锁相环、逐次逼近型模数转换器、低功耗、低成本研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 &…...

混合模拟技术革新ML系统性能评估

1. 项目概述:混合模拟技术如何革新ML系统性能评估 在大型语言模型训练场景中,工程师常常面临这样的困境:要评估不同并行策略(如数据并行、流水线并行)对训练速度的影响,传统方法要么需要搭建昂贵的多GPU测试…...

手把手教你用AsyncOpenAI库,为自部署的Llama 3模型打造一个高速问答接口

基于AsyncOpenAI与Llama 3构建高并发问答接口的工程实践 在当今AI应用开发领域,如何将开源大模型高效地集成到生产环境中,是许多开发者面临的挑战。特别是当我们需要处理大量并发请求时,传统的同步调用方式往往成为性能瓶颈。本文将深入探讨…...

3种创新方案解决抖音视频保存难题

3种创新方案解决抖音视频保存难题 【免费下载链接】douyin_downloader 抖音短视频无水印下载 win编译版本下载:https://www.lanzous.com/i9za5od 项目地址: https://gitcode.com/gh_mirrors/dou/douyin_downloader 你是否曾遇到过这样的困扰:在抖…...

C51外部代码空间读取技术:CBYTE/CWORD宏详解

1. C51外部代码空间读取技术解析在8051单片机开发中,经常需要从外部程序存储器(Code Space)读取数据,这是嵌入式系统开发中的一项基础但关键的操作。许多开发者在使用Keil C51工具链时,会遇到如何正确读取外部程序存储器的问题。本文将深入解…...

3分钟快速找回:手机号查QQ号Python工具完整指南

3分钟快速找回:手机号查QQ号Python工具完整指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾因为忘记QQ号而无法登录?或者换了新手机后,只记得手机号却找不到对应的QQ账号?…...

Lenovo Legion Toolkit 终极指南:如何让你的拯救者笔记本性能提升30%

Lenovo Legion Toolkit 终极指南:如何让你的拯救者笔记本性能提升30% 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...

WebPlotDigitizer技术架构深度解析:计算机视觉驱动的图表数据提取引擎

WebPlotDigitizer技术架构深度解析:计算机视觉驱动的图表数据提取引擎 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 在科…...

中兴光猫深度管理终极指南:一键开启工厂模式与永久Telnet服务

中兴光猫深度管理终极指南:一键开启工厂模式与永久Telnet服务 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 在当今家庭和企业网络中,中兴光猫设备扮演着至关重…...

免费开源AMD Ryzen调试神器:ZenStatesDebugTool完整使用指南

免费开源AMD Ryzen调试神器:ZenStatesDebugTool完整使用指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

Sub-agent 协同失效的 3 类边界场景:Claude Code 8.1 机制原理解析

1. Sub-agent 协同失效不是 Bug,是机制在“按说明书执行” 大多数人第一次遇到 Sub-agent 返回空响应、反复循环调用主 Agent、或在多轮协作后突然“忘记”前序任务时,第一反应是:配置错了?网络不稳定?模型退化了?我试过把 claude-code 从 8.0.3 升到 8.1.1,又降回 8.0…...

2026 年 30 个 MCP Server 实测评:Claude Code 集成效果与响应延迟对比数据

1. 30个MCP Server实测评背后的真实问题:Claude Code不是“插上就快”,而是“配错就崩” 我上线第三个内部MCP Server时,CI流水线里一个原本2秒完成的代码补全请求,突然卡在waiting for MCP response状态长达17秒。日志里没有报错,只有反复重试的HTTP 504。排查了两天,最…...

双机双卡训练yolov5(yolov5+pytorch+DDP+NCCL+RDMA全栈解析)

重点关注问题:1、nvidia-smi topo -m 是怎么获取topo结构的?调用了什么api?2、以下接口有什么用,怎么实现的?nvmlDeveiceGetNvLinkVersionnvmlDeveiceGetNvLinkCapabilitynvmlDeveiceGetNvLinkStatenvmlDeveiceGetNvLi…...

QQ音乐解析终极指南:如何免费获取全网音乐资源

QQ音乐解析终极指南:如何免费获取全网音乐资源 【免费下载链接】MCQTSS_QQMusic QQ音乐解析 项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic 你是否厌倦了音乐平台的层层限制?想要畅听所有歌曲却不想支付高昂的会员费?Q…...

Perplexity课程查询功能全链路拆解(从API底层到UI交互逻辑)

更多请点击: https://kaifayun.com 第一章:Perplexity课程查询功能全链路概览 Perplexity 的课程查询功能并非单一接口调用,而是一套覆盖用户意图理解、多源数据协同检索、结构化结果生成与实时反馈优化的端到端系统。其核心目标是将自然语言…...

如何用Winhance一键优化Windows系统?完整免费指南

如何用Winhance一键优化Windows系统?完整免费指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...

Vue3生态系统:打造完整的前端开发体系

Vue3生态系统:打造完整的前端开发体系 前言 大家好,我是前端老炮儿。今天咱们来聊聊Vue3的生态系统。 如果说Vue3是一辆超级跑车,那它的生态系统就是配套的加油站、维修站和改装厂。一个好的框架不仅要有强大的核心能力,还要有…...

Gemini 垂直行业模型路由:按意图选择不同Prompt与参数集

在AI开发社区里,不少工程师都在尝试把多个大模型接入实际项目。工具整合站点作为AI模型聚合平台,让开发者能快速对比Gemini与其他模型在不同行业场景下的表现。今天我们来聊聊如何为Gemini搭建一套垂直行业模型路由机制,根据用户意图自动选择…...

CTFSHOW-WEB入门(1)信息收集

web1f12得到flagweb2虽然f12不能打开,但是curlU就直接开了得到flag也可以在url前面加个view-source,效果一样也可以通过浏览器打开开发者工具web3没思路的时候抓个包看看,可能会有意外收获得到flagweb4总有人把后台地址写入robots&#xff0c…...