C++入门(02)简单了解C++应用程序的开发部署
文章目录
- 1. 开发C++应用程序
- 2. 简单示例计算器程序
- 3. 需求分析
- 4. 设计
- 5. 编码
- 6. 编译
- 7. 调试
- 8. 测试
- 9. 部署
- 10. 部署示例
- 10.1 使用Visual Studio Installer Projects创建安装程序
- 10.2 安装VisualStudio Installer Projects扩展
- 10.3 在calculator解决方案中创建安装项目
- 10.3.1 添加安装项目
- 10.3.2 配置安装项目
- 10.3.3 添加快捷方式
- 10.3.4 设置安装属性
- 10.4 生成安装程序
- 10.5 在用户计算机安装我们的计算器程序
- 10.6 部署示例小结
1. 开发C++应用程序
开发应用程序的过程可以细分为:需求分析、设计、编码、编译、调试、测试、部署
2. 简单示例计算器程序
假设开发一个简单的命令行计算器,可以进行加法、减法、乘法和除法操作。
3. 需求分析
程序的需求是什么?对于这个计算器程序,需求可能是这样的:
- 用户可以输入两个数字
- 用户可以选择执行的操作(加、减、乘、除)
- 程序输出计算结果
- 如果用户输入非法数据或者除以零,程序应当提示错误
4. 设计
考虑如何实现这些功能?
- 用什么变量来存储用户输入的数字?
- 如何设计功能模块,比如加法、减法等操作?
- 如何处理输入错误?
我们可以简单地设计一个基本结构:
- 主函数 main() 用来控制程序的流程
- 使用 cin 读取用户的输入,cout 输出结果
- 使用条件语句 if-else 或 switch 处理用户选择的操作
5. 编码
简单的 C++ 实现,按照这个步骤(C++入门(01)VisualStudio2022社区版HelloWorld),创建项目 - 源码文件:calculator.cpp
#include <iostream> // 包含标准输入输出库using namespace std;int main() {double num1, num2; // 声明两个变量用于存储用户输入的数字char operation; // 声明一个变量用于存储操作符// 提示用户输入两个数字和一个操作符cout << "Enter first number: ";cin >> num1;cout << "Enter an operator (+, -, *, /): ";cin >> operation;cout << "Enter second number: ";cin >> num2;// 根据用户输入的操作符执行相应的计算switch (operation) {case '+':cout << "Result: " << num1 + num2 << endl;break;case '-':cout << "Result: " << num1 - num2 << endl;break;case '*':cout << "Result: " << num1 * num2 << endl;break;case '/':// 检查除数是否为零if (num2 != 0) {cout << "Result: " << num1 / num2 << endl;} else {cout << "Error: Division by zero!" << endl;}break;default:cout << "Error: Invalid operator!" << endl;}return 0; // 程序成功结束
}
6. 编译
编写完代码以后,要进行编译。
编译是将 C++ 代码转换为计算机可以执行的机器语言。
Ctrl + F5
Visual Studio将自动完成代码的编译,并在控制台窗口中运行程序
如果一切顺利,没有语法错误
将会把源代码文件calculator.cpp 编译成可执行文件 calculator.exe

7. 调试
调试是找到并修复程序中的错误的过程,比如在运行程序时,如果发现除数为零的情况没有正确提示错误,就需要检查代码进行修改。
8. 测试
测试是为了保证程序在各种输入情况下都能够正确运行。
对于这个计算器程序来讲,测试包括:
- 正常输入两个数字和操作符,检查是否正确输出结果
- 测试非法操作符输入,比如输入“%”,检查是否正确提示错误
- 测试除以零的情况,看看是否输出响应的错误信息
9. 部署
当程序经过测试没有问题后,就可以部署给用户使用了。把程序打包发布给其他人使用,让其他人可以在他们的计算机上使用你的程序。
部署不仅仅是生成可执行文件,还包括处理依赖项、设置安装环境等,保障程序在用户的系统上正常运行。
10. 部署示例
10.1 使用Visual Studio Installer Projects创建安装程序
Visual Studio Installer Projects是一个扩展工具,可以帮助创建Windows安装包,例如MSI文件。
10.2 安装VisualStudio Installer Projects扩展
点击菜单栏的“扩展”,选择“管理扩展”。

在弹出的窗口中,搜索“Microsoft Visual Studio Installer Projects”
找到后点击“下载”,安装此扩展




安装完成后,重新打开Visual Studio ,重新打开我们的计算器calculator解决方案

10.3 在calculator解决方案中创建安装项目
10.3.1 添加安装项目
右键点击解决方案calculator,选择“添加” -> “新建项目”。

在搜索框中输入“Setup Project”,选择“Setup Project”,点击“下一步”。

给安装项目起个名字,比如CalculatorInstaller,然后点击“创建”。

10.3.2 配置安装项目
右键点击“Application Folder”,选择“添加” -> “项目输出”

在弹出的窗口中,选择CalculatorApp的“主输出”,点击“确定”

现在CalculatorApp.exe文件就被添加到安装包中了
10.3.3 添加快捷方式
右键点击CalculatorApp.exe,选择“创建快捷方式”


将快捷方式拖动到“User’s Desktop”文件夹中,这样未来用户安装以后会在桌面上生成快捷方式

10.3.4 设置安装属性
在解决方案资源管理器,选中CalculatorInstaller项目,打开属性窗口

打开属性窗口后,你会看到许多选项可以配置
ProductName(产品名称),例如:Calculator Application。
Manufacturer(制造商),例如:Your Name or Company。
Version(版本),例如:1.0.0。这个版本号用于区分不同的程序版本。
Author(作者),通常和制造商信息相同
InstallAllUsers(安装方式),一般选择True,这样所有系统用户都可以使用程序。
UpgradeCode(升级代码),这是用于识别安装包的唯一代码。如果以后要发布更新,升级代码必须保持一致

10.4 生成安装程序

Visual Studio会生成安装包
CalculatorInstaller.msi 文件是主要的安装程序文件,包含了应用程序的所有文件、安装脚本和其他相关信息。
setup.exe 文件是一个安装引导程序,通常与 .msi 文件一起工作,会首先安装所有先决条件,然后调用 .msi 文件进行主程序的安装
10.5 在用户计算机安装我们的计算器程序
拷贝安装包到另外一台没有C++环境的计算机,双击setup.exe
这台用户计算机并没有C++环境

进入安装向导界面





做安装文件的时候,要起好名称啊,安装完毕,运行
对于我们这个简单的小程序而言,其实和直接拷贝.exe到用户计算机是一样的

10.6 部署示例小结
- 直接拷贝.exe可执行文件:适合简单的小程序,没有复杂的依赖关系
- 创建安装程序 Installer,利用工具创建用户友好的安装包
相关文章:
C++入门(02)简单了解C++应用程序的开发部署
文章目录 1. 开发C应用程序2. 简单示例计算器程序3. 需求分析4. 设计5. 编码6. 编译7. 调试8. 测试9. 部署10. 部署示例10.1 使用Visual Studio Installer Projects创建安装程序10.2 安装VisualStudio Installer Projects扩展10.3 在calculator解决方案中创建安装项目10.3.1 添…...
有了室内外一体化人行导航,你还怕迷路吗?
在快节奏的现代生活中,无论是穿梭于繁华的都市丛林,还是漫步于错综复杂的购物中心,迷路似乎成了不少人的“小确丧”。然而,随着科技的飞速发展,一项革命性的创新——室内外一体化人行导航系统,正悄然改变着…...
Python虚拟环境包迁移
1. 激活源虚拟环境 首先,激活你想要导出包的源虚拟环境。在命令行中输入: Windows: path\to\your\source_env\Scripts\activatemacOS/Linux: source path/to/your/source_env/bin/activate 2. 导出已安装包的列表 使用以下命令生成一个requirements…...
利用分布式锁在ASP.NET Core中实现防抖
前言 在 Web 应用开发过程中,防抖(Debounce) 是确保同一操作在短时间内不会被重复触发的一种有效手段。常见的场景包括防止用户在短时间内重复提交表单,或者避免多次点击按钮导致后台服务执行多次相同的操作。无论在单机环境中&a…...
Django+Vue3前后端分离学习(二)(重写User类)
一、重写User类: 1、首先导入User类: from django.contrib.auth.models import User 2、然后点在User上,按住ctrl 点进去,发现 User类继承AbstractUser Ctrl点进去AbstractUser,然后将此方法全部复制到自己APP的mo…...
兔英语语法体系——观后笔记
目录 一、视频链接 二、视频前言 三、简单句(Simple Sentences) 1. 可独立完成的动作 2. 有1个动作的承受者 3. 有两个动作承受者 4. 只有一个动作承受者(但需补充) 5. 非 “动作” 6. 总结 四、五大基本句型 五、句子成分 6. 定语 7. 状语 8. 同位语 9. 总结 …...
哈希表如何避免冲突
系列文章: 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 3. 哈希表如何避免冲突 目录 1.概念 2. 冲突-概念 3. 冲突-避免 3.1 冲突-避免-哈希函数设计 3.2 冲突-避免-负载因子调节 4. 冲突-解决 4.1 冲突-解决-闭散列 4.1.1 线性探…...
内核模块驱动开发
内核模块开始学习前,一定是最先接触到内核模块三要素(面试),驱动入口、驱动出口和协议的遵循。 1.内核模块三要素(面试)//修饰模块化驱动的入口函数module_init(demo_init);//修饰模块化驱动的出口函数module_eixt(demo_exit);//遵循GPL开源协议MODULE_…...
Linux 下 alsa 库录音并保存为 WAV 格式
麦克风列表: [jnjn build]$ arecord -l **** List of CAPTURE Hardware Devices **** card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]Subdevices: 1/1Subdevice #0: subdevice #0 card 1: Camera [2K USB Camera], device 0: USB Aud…...
使用stripe进行在线支付、退款、订阅、取消订阅功能(uniapp+h5)
stripe官网:Stripe 登录 | 登录 Stripe 管理平台 然后在首页当中打开测试模式,使用测试的公钥跟私钥进行开发 测试卡号 4242 4242 4242 4242 1234 567 在线支付 stripe的在线支付有两种,第一种就是无代码,第二中就是使用api进行自定义,一般来说推荐第二种进行开发 无…...
深度学习中常见的损失函数
关注B站可以观看更多实战教学视频:hallo128的个人空间 深度学习中常见的损失函数 损失函数的作用 损失函数是衡量神经网络输出与真实标签之间差距的指标。在训练过程中,神经网络的目标是最小化损失函数的值。常见的损失函数包括均方误差(MS…...
认识Linux及Linux的环境搭建
目录 1、什么是Linux2、Linux环境搭建2.1 下载安装 Xshell2.2 下载安装 VMware Workstation Pro2.3 选择适合自己系统 1、什么是Linux Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼ÿ…...
Java之线程篇三
目录 线程状态 观察线程的所有状态 线程状态及其描述 线程状态转换 代码示例1 代码示例2 线程安全 概念 线程不安全的代码示例 线程不安全的原因 线程安全的代码示例-加锁 synchronized关键字 synchronized的特性 小结 形成死锁的四个必要条件 …...
Bootstrap动态设置表格title项
页面searchType <form id"formId"><div class"select-list"><ul><li><select name"searchType" id"searchType"><option value"1">按各节点统计</option><option value"…...
Arrays.sort()方法在Java中的使用:理论与实践
目录 一.概述 二.实现方式 三.具体介绍 1.基本数据类型数组 2.对象数组 1)使对象实现Comparable接口 2)为对象再专门实现一个比较器类 四.进阶技巧 1.基础类型数组实现自定义比较 2.如何进行逆序排序 3.lambda表达式实现比较器类 4.List的排序方法Collection.sort()…...
用AI写论文,千万不要这样用ChatGPT生成参考文献References!!
ChatGPT作为一种先进的语言大模型,被广泛用于生成文本,虽然用ChatGPT辅助论文写作已是大势所趋,但是,用于生成参考文献References的部分还是要谨慎对待。 在学术写作中,参考文献References扮演着至关重要的角色&#…...
Debian 12如何关闭防火墙
在Debian 12中,默认的防火墙管理工具是ufw(Uncomplicated Firewall)。您可以使用以下命令来关闭防火墙: 关闭防火墙: sudo ufw disable查看防火墙状态: sudo ufw status如果需要重新开启防火墙:…...
windows C++-并行编程-PPL任务并行(二)
延续任务 在异步编程中,一个异步操作在完成时调用另一个操作并将数据传递到其中的情况非常常见。 传统上,这使用回调方法来完成。 在并发运行时中,延续任务提供了同样的功能。 延续任务(也简称为“延续”)是一个异步任务,由另一个…...
快速了解 servlet(SpringMVC 的底层)
Servlet 是 Java EE(现 Jakarta EE)中用于处理 Web 请求的核心组件。它在 Web 应用程序的服务器端运行,负责接收和处理客户端(如浏览器)的请求,并生成响应。 尽管现代Web开发更多采用SpringMVC等框架&…...
QT中tr的作用是什么
在Qt框架中,tr() 函数是一个非常重要的宏,它用于国际化和本地化(i18n和l10n)支持。tr() 函数使得Qt应用程序能够根据不同的语言环境(locale)显示相应的翻译文本,从而支持多种语言。 具体来说&a…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
