当前位置: 首页 > 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…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...