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

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会生成安装包
生成完成后,安装程序文件会在\Debug 或 \Release 文件夹下找到(路径可能是CalculatorInstaller\Debug)。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 添…...

有了室内外一体化人行导航,你还怕迷路吗?

在快节奏的现代生活中&#xff0c;无论是穿梭于繁华的都市丛林&#xff0c;还是漫步于错综复杂的购物中心&#xff0c;迷路似乎成了不少人的“小确丧”。然而&#xff0c;随着科技的飞速发展&#xff0c;一项革命性的创新——室内外一体化人行导航系统&#xff0c;正悄然改变着…...

Python虚拟环境包迁移

1. 激活源虚拟环境 首先&#xff0c;激活你想要导出包的源虚拟环境。在命令行中输入&#xff1a; Windows: path\to\your\source_env\Scripts\activatemacOS/Linux: source path/to/your/source_env/bin/activate 2. 导出已安装包的列表 使用以下命令生成一个requirements…...

利用分布式锁在ASP.NET Core中实现防抖

前言 在 Web 应用开发过程中&#xff0c;防抖&#xff08;Debounce&#xff09; 是确保同一操作在短时间内不会被重复触发的一种有效手段。常见的场景包括防止用户在短时间内重复提交表单&#xff0c;或者避免多次点击按钮导致后台服务执行多次相同的操作。无论在单机环境中&a…...

Django+Vue3前后端分离学习(二)(重写User类)

一、重写User类&#xff1a; 1、首先导入User类&#xff1a; from django.contrib.auth.models import User 2、然后点在User上&#xff0c;按住ctrl 点进去&#xff0c;发现 User类继承AbstractUser Ctrl点进去AbstractUser&#xff0c;然后将此方法全部复制到自己APP的mo…...

兔英语语法体系——观后笔记

目录 一、视频链接 二、视频前言 三、简单句(Simple Sentences) 1. 可独立完成的动作 2. 有1个动作的承受者 3. 有两个动作承受者 4. 只有一个动作承受者(但需补充) 5. 非 “动作” 6. 总结 四、五大基本句型 五、句子成分 6. 定语 7. 状语 8. 同位语 9. 总结 …...

哈希表如何避免冲突

系列文章&#xff1a; 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 3. 哈希表如何避免冲突 目录 1.概念 2. 冲突-概念 3. 冲突-避免 3.1 冲突-避免-哈希函数设计 3.2 冲突-避免-负载因子调节 4. 冲突-解决 4.1 冲突-解决-闭散列 4.1.1 线性探…...

内核模块驱动开发

内核模块开始学习前&#xff0c;一定是最先接触到内核模块三要素(面试)&#xff0c;驱动入口、驱动出口和协议的遵循。 1.内核模块三要素(面试)//修饰模块化驱动的入口函数module_init(demo_init);//修饰模块化驱动的出口函数module_eixt(demo_exit);//遵循GPL开源协议MODULE_…...

Linux 下 alsa 库录音并保存为 WAV 格式

麦克风列表&#xff1a; [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站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 深度学习中常见的损失函数 损失函数的作用 损失函数是衡量神经网络输出与真实标签之间差距的指标。在训练过程中&#xff0c;神经网络的目标是最小化损失函数的值。常见的损失函数包括均方误差&#xff08;MS…...

认识Linux及Linux的环境搭建

目录 1、什么是Linux2、Linux环境搭建2.1 下载安装 Xshell2.2 下载安装 VMware Workstation Pro2.3 选择适合自己系统 1、什么是Linux Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff…...

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作为一种先进的语言大模型&#xff0c;被广泛用于生成文本&#xff0c;虽然用ChatGPT辅助论文写作已是大势所趋&#xff0c;但是&#xff0c;用于生成参考文献References的部分还是要谨慎对待。 在学术写作中&#xff0c;参考文献References扮演着至关重要的角色&#…...

Debian 12如何关闭防火墙

在Debian 12中&#xff0c;默认的防火墙管理工具是ufw&#xff08;Uncomplicated Firewall&#xff09;。您可以使用以下命令来关闭防火墙&#xff1a; 关闭防火墙&#xff1a; sudo ufw disable查看防火墙状态&#xff1a; sudo ufw status如果需要重新开启防火墙&#xff1a;…...

windows C++-并行编程-PPL任务并行(二)

延续任务 在异步编程中&#xff0c;一个异步操作在完成时调用另一个操作并将数据传递到其中的情况非常常见。 传统上&#xff0c;这使用回调方法来完成。 在并发运行时中&#xff0c;延续任务提供了同样的功能。 延续任务(也简称为“延续”)是一个异步任务&#xff0c;由另一个…...

快速了解 servlet(SpringMVC 的底层)

Servlet 是 Java EE&#xff08;现 Jakarta EE&#xff09;中用于处理 Web 请求的核心组件。它在 Web 应用程序的服务器端运行&#xff0c;负责接收和处理客户端&#xff08;如浏览器&#xff09;的请求&#xff0c;并生成响应。 尽管现代Web开发更多采用SpringMVC等框架&…...

QT中tr的作用是什么

在Qt框架中&#xff0c;tr() 函数是一个非常重要的宏&#xff0c;它用于国际化和本地化&#xff08;i18n和l10n&#xff09;支持。tr() 函数使得Qt应用程序能够根据不同的语言环境&#xff08;locale&#xff09;显示相应的翻译文本&#xff0c;从而支持多种语言。 具体来说&a…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...