最稳妥方式是用vs的microsoft visual studio installer projects插件生成msi安装包,需手动安装插件并重启vs;添加主输出后须手动补全依赖dll、资源文件及ico图标;创建桌面快捷方式并拖至user’s desktop;最终生成setup.exe和.msi双文件供用户安装。

直接用 VS 自带的 Microsoft Visual Studio Installer Projects 插件生成 MSI 安装包,是最稳妥、用户双击就能装、还能自动注册卸载项的方式。其他“压缩整个文件夹”或“只发 .exe”看似简单,但大概率在别人机器上闪退——缺 DLL、路径硬编码、图标丢失、没权限写配置,全得靠运气。
安装 Microsoft Visual Studio Installer Projects 插件
这个插件不是默认启用的,必须手动安装,且 VS 重启后才生效:
- 关闭所有 VS 实例(连后台进程
devenv.exe都要结束) - 打开 VS → 扩展 → 管理扩展 → 搜索
Microsoft Visual Studio Installer Projects 2022(VS 2019 用户搜2019版本) - 下载完成后,VS 会弹窗提示安装 → 全部点“是”,安装完再重启 VS
- 验证是否成功:新建项目时搜索
Setup Project能出现,就说明插件已就位
常见坑:Installer Projects 不支持跨 VS 版本混用(比如 VS 2022 插件不能在 VS 2019 里加载),也**不支持 C++/CLI 项目直接添加为“项目输出”**——这类项目得手动复制 .dll 和 .exe 到 Application Folder。
添加项目输出并处理依赖 DLL
主输出 只打包你项目的 .exe 或 .dll,但不会自动带上它依赖的运行时库(如 vcruntime140.dll、msvcp140.dll)或第三方库(如 glfw3.dll、openal32.dll)。漏掉任何一个,安装后一运行就报“找不到指定模块”。
- 右键
Application Folder→Add→项目输出→ 选中你的 C++ 项目 → 勾选主输出(这是你的.exe) - 再右键
Application Folder→Add→文件,把以下三类文件手动拖进去:- 你项目 bin/Debug 或 bin/Release 下的所有
.dll - Visual C++ 运行时(推荐用
vcredist_x64.exe作为“系统必备”单独安装,而不是塞进安装包) - 资源文件(
pic/、audio/、shaders/等)——注意路径层级要和代码里fopen("pic/bg.png")的相对路径一致
- 你项目 bin/Debug 或 bin/Release 下的所有
- 如果用了静态链接(
/MT),可跳过大部分 DLL;但若用了动态链接(/MD,VS 默认),就必须补全运行时,否则必崩
创建桌面快捷方式并设置图标
用户不会去翻 Program Files 找你的 .exe。快捷方式不是锦上添花,而是可用性的底线。
- 右键
主输出→Create Shortcut to 主输出… - 重命名快捷方式(比如叫
MyGame,别留默认名) - 右键该快捷方式 →
Properties→ 在Icon字段填入你准备好的.ico文件路径(必须是绝对路径,且文件得先加到Application Folder里) - 把快捷方式拖到
User’s Desktop或User’s Programs Menu文件夹下
注意:Icon 属性不支持 PNG/JPG,必须是 ICO 格式;如果图标没显示,大概率是 ICO 文件没放进安装包,或者路径填错了。
生成 setup.exe 并验证安装行为
生成的是 setup.exe(引导程序)和 .msi(实际安装包),两者都要发给用户。只发 .msi 会导致缺少 VC++ 运行时检查逻辑。
- 右键 Setup 项目 →
重新生成(不是“生成”,必须是“重新生成”,否则可能缓存旧输出) - 生成成功后,在项目目录下的
Debug或Release文件夹里找setup.exe和xxx.msi - 在干净虚拟机(没装过 VS、没装过 VC++ 运行时)上双击
setup.exe测试:- 能否正常弹出安装向导
- 安装后桌面是否有图标、能否双击启动
- 启动后是否报 DLL 缺失、资源路径错误、黑窗口闪退
- 控制面板 → “程序和功能”里能否看到条目,并能正常卸载
最容易被忽略的一点:安装路径默认是 C:\Program Files\YourApp,而你的代码如果用硬编码路径写死了 "./data/config.txt",在非管理员权限下可能因 UAC 重定向失败导致读写异常——务必用 GetModuleFileName + PathRemoveFileSpec 动态算出 EXE 所在目录,再拼接资源路径。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











