C++ 开发环境其实挺难搞的(上)

news2024/10/7 18:30:29

所谓工欲善其事,必先利其器,我将用两节课的内容向大家介绍 C++ 的开发工具开发环境的一些知识。

Visual Studio 诞生至今已有 25 年以上的历史,功能强大,用的人非常多,社区的朋友戏称它为宇宙最强大的 IDE,我觉得如果不考虑外星文明的话,它确实是名副其实的。下图是 GitHub 统计的 IDE 排名情况,Visual Studio 稳居第一。

本节课我们就介绍一些 Visual Studio 的基本功能,从如何安装 Visual Studio 到使用 Visual Studio 开发一个简单的 C++ 应用程序,再到 Visual Studio 中的一些常用功能和配置属性,总之,我会尽可能地带领大家从 Visual Studio Code 迁移到 Visual Studio 上来

使用 Visual Studio 开发工具

你可以从 Visual Studio 官网下载 Visual Studio 开发工具。选择 Community 版即可。

Visual Studio 是一个集成开发工具,在安装的时候,我们只要选择 C++ 相关的套件即可,如下图所示:

注意:我们安装的 Windows SDK 的版本是 10.0.19041.0,稍后我们还会介绍到它。

前端开发者的现代 C++ 课 - 刘晓伦liulun - 掘金小册专门为前端开发者“定制”的现代 C++ 编程指南。「前端开发者的现代 C++ 课」由刘晓伦liulun撰写,490人购买https://s.juejin.cn/ds/kUo6RHC/

由于是在线安装,所以安装过程比较漫长,需要耐心等待。如果你要离线安装 Visual Studio,可以参考这篇文章的后半部分。

安装完 Visual Studio 之后,创建一个 C++ 空项目,如下图所示:

项目创建成功之后,你会在 Visual Studio 右侧看到解决方案资源管理器的界面:

 

上图中,头文件源文件资源文件都是过滤器,并不是文件夹,如果你希望让解决方案资源管理器显示具体的文件路径,可以点击红框标记的按钮(显示所有文件按钮)。

右键点击解决方案资源管理器中的工程文件(上图中黑色粗体标记的项),为工程添加一个 main.cpp 文件,这就是我们的第一个程序文件。在这个文件中键入如下代码:

#include <iostream>
int main() {
    std::cout << "Hello World!" << std::endl;
    char c = std::getchar();
    return 0;
}

上述代码使用std::cout向控制台窗口输出一个字符串Hello World!,接着使用std::getchar方法接收用户输入的一个字符,当用户真正输入字符后,程序退出(本节旨在介绍开发环境,这里只简单介绍一下代码)。

接着点击 Visual Studio 中的调试按钮,启动程序,如下图所示:

此时你会看到控制台窗口输出 Hello World!,随便输入一个字符,然后按下回车键,应用程序会跟着退出,符合我们的预期。

程序运行一次之后会在 \x64\Debug 目录下生成 exe 可执行文件,如果你把上图中的 Debug选项调整成 Release ,再次运行程序,那么 \x64\Release 目录下也会生成相应的可执行文件。如果你把上图中的 x64 选项调整成 x86 ,再次运行程序,那 \Release 或 \Debug目录下会出现相应的可执行文件。

我们可以在源码编辑器的左侧为程序设置断点,当程序运行到断点之后会停止运行,此时我们可以把鼠标移至某个变量,观察它此刻的值,如下图所示:

调试方式和我们在网页中用开发者调试工具调试 JavaScript 代码类似

熟悉 Visual Studio 开发工具

如果你的代码存在错误,那么在启动调试之后,Visual Studio 会在错误列表窗口给出错误提示,如下图所示:

鼠标双击某行错误信息,C++ 编辑器会直接为你定位到出错的行。

另外,启动调试之后,Visual Studio 会在输出窗口给出编译过程信息及开发者要求输出到控制台的信息,如下图所示:

如果你不小心关闭了这两个窗口,那么可以在菜单视图->输出、菜单视图->错误列表中重新打开这两个窗口。

作为前端开发者你肯定熟悉 VS Code 的快捷键,你可以通过如下方式把 Visual Studio 的快捷键设置成与 VS Code 相同的快捷键方案(点击菜单工具->选项打开如下窗口):

设置好快捷键之后,按下 Ctrl+F 键打开查找窗口,你可以在这个窗口中查找源码中指定的信息,如下图所示(注意查找范围):

按下 Ctrl+P 后打开文件查找对话框,输入文件名就可以查找工程中指定的文件,如下图所示:

当工程变得庞大之后,这两个查找窗口非常有用。

Visual Studio 还有很多有用的窗口,这里我们只介绍比较重要的几个,其他的就留给你自己去探索了。

常规配置属性

右键点击工程文件,打开工程的属性对话框,如下图所示:

首先配置下拉框中默认包含 Debug 和 Release 两个选项,默认情况下使用 Debug 方式编译出的二进制程序未经压缩和优化,体积较大,但便于调试。使用 Release 编译出的二进制程序,经过了压缩和优化,体积较小,便于分发给用户。

平台下拉框中默认包含 X64 和 Win32 两个选项,这两个选项标志着你在为什么平台编译程序,X64 是指 64 位操作系统,Win32 是指 32 位操作系统。

切换了这两个下拉框之后,下面的配置属性中的选项也会跟着切换,也就是说,如果你把 Debug 的配置属性修改的和 Release 的配置属性一模一样,那么即使使用 Debug 编译应用程序,最终得到的也是压缩和优化的二进制程序,与使用 Release 编译出的二进制程序一模一样

在上图配置属性->常规的配置项中,输出目录指定的是工程编译完成后二进制程序输出的目录路径;中间目录是编译过程中产生的一些临时文件的存放路径;目标文件名是编译完成后二进制程序的文件名。

这三项配置都用到了 Visual Studio 内置的配置宏,比如$(SolutionDir)代表着工程文件所在目录,你可以到微软官网查阅具体的宏对应的含义。

上图中 配置类型 为编译后生成的二进制程序的文件类型,常见的有动态库.dll静态库.lib应用程序.exe,其中应用程序.exe 就是可执行程序,这里就不多做解释了。

我们可以简单地把动态库理解为 dll 文件,应用程序可以在运行时主动地加载动态库并调用动态库暴露出来的方法。这很像我们在 Node.js 代码中 require 一个独立的 js 文件

一个动态库可以被多个应用程序同时使用,Windows 操作系统内就包含了很多动态库。实际上 Node.js 的原生模块(.node 文件)就是一个比较特殊的动态库。

我们可以简单地把静态库理解为 lib 文件,静态库文件里包含库的实现代码,如果一个应用程序依赖某个静态库,那么编译这个应用程序时,就会直接把静态库编译到应用程序自己的二进制文件中。这很像 Webpack 或 Rollup 帮我们把多个 js 脚本捆扎成一个 js 脚本,这样在分发应用程序时,就不必再分发库文件了。

由此可见,动态库有利于复用,静态库有利于分发

每个 Windows 应用程序都会或多或少地依赖操作系统 API,Windows SDK 版本就是为你的应用程序指定系统 API 版本的配置项,我们安装 Visual Studio 的时候,就安装了 Windows SDK 10.0.19041.0,选择什么 Windows SDK 版本意味着你的应用程序要兼容什么版本的 Windows 操作系统。不过 Windows 操作系统向来兼容性都很不错,一般开发者都会选择最新的 Windows SDK 版本。

平台工具集指定你的应用程序使用什么工具进行编译链接。这里需要注意的是,选择不同的平台工具集后 Windows SDK 版本也可能会跟着切换,因为有些低版本的平台工具集无法适配高版本的 Windows SDK。此处我们也应该尽量使用最新版本的平台工具集。

C++ 语言标准指定你的应用程序使用什么版本的 C++ 进行开发。自 C++ 11 以来,C++ 标准委员会每 3 年发布一个版本,不过编译器对新语言特性的支持相对来说比较滞后,目前来看新项目使用 C++ 17 的开发者比较多,不过我们选择 C++ 20,提早让大家熟悉这个版本的 C++ 语言。

其他重要的配置属性

配置项配置属性->调试->命令参数可以让你通过 Visual Studio 启动应用程序调试时,为你的应用程序传入特定的命令行参数。同样你也可以在这个面板中设置应用程序的工作目录

你可以在配置属性->生成事件面板中配置应用程序的生成前事件链接前事件生成后事件,这些地方设置的都是 CMD 命令,你可以让这些命令帮你完成很多有用的任务,比如应用程序生成前准备环境,应用程序生成后打扫垃圾等。

如果你希望你开发的应用程序有更高的权限,访问一些特殊文件或系统 API,那么你可以配置配置属性->链接器->清单文件、 UAC 执行级别UAC 绕过 UI 保护配置项。

开发桌面应用时,要把配置属性->链接器->系统->子系统的值设置为窗口 (/SUBSYSTEM:WINDOWS);开发控制台应用时,要把值设置为控制台 (/SUBSYSTEM:CONSOLE)

开发桌面应用时,如果你的窗口界面显得模糊不清,那么可以把配置属性->清单工具->输入和输出->DPI识别功能设置为高DPI识别

总结

本节我们主要介绍了“宇宙最强大的 IDE ”: Visual Studio 的一些基础功能和配置。

  • 首先,我们介绍了如何安装 Visual Studio(安装过程中附带安装了 Windows SDK );
  • 接着,我们使用 Visual Studio 开发了一个简单 C++ 的程序(同时还讲解了怎么调试这个程序);
  • 然后,介绍了 Visual Studio 的一些基础功能(比如查找字符串或文件等功能);
  • 最后,我们介绍了 C++ 工程的一些常规配置属性(动态链接库、静态链接库、平台工具集等)。

开发者仅仅了解这些内容肯定还不能娴熟地使用 Visual Studio 开发 C++ 项目,下一节将进一步介绍 Visual Studio 开发工具的相关知识。

前端开发者的现代 C++ 课 - 刘晓伦liulun - 掘金小册专门为前端开发者“定制”的现代 C++ 编程指南。「前端开发者的现代 C++ 课」由刘晓伦liulun撰写,490人购买https://s.juejin.cn/ds/kUo6RHC/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 147. 对链表进行插入排序

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 147. 对链表进行插入排序&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 二、…

ECC原理和RocketChip Cache ECC实现

一、ECC原理说明ECC(Error Correcting Code)全称为错误纠正码&#xff0c;用于对存储器的数据进行完整性检查和纠正&#xff0c;主要用在SRAM、DDR、NAND等存储器设备上。ECC可以对数据进行单比特的纠错和多比特的检错&#xff0c;其原理基于汉明码编码而来。下图是ECC编码的主…

如何通过光耦合器连接继电器

如何通过光耦合器连接继电器 介绍 以下文章介绍如何使用隔离方法或通过光耦合器器件驱动继电器。我们将学习三种方法&#xff0c;第一种方法是将继电器直接连接到光耦合器输出引脚&#xff0c;第二种方法是使用外部PNP晶体管&#xff0c;第三种方法是使用外部NPN晶体管。任何…

二十九、Docker (5)

&#x1f33b;&#x1f33b; 目录一、Maven Docker 插件构建 Docker 镜像1.1 maven Docker 插件构建 Docker 镜像入门1.2 maven Docker 插件构建 Docker 镜像&#xff0c;自定义 DockerFile1.3 maven Docker 插件构建并推送镜像到 Docker 私有仓库二、手动发布部署微服务项目到…

类与对象(三):stactic成员、友元、内部类

类与对象&#xff08;三&#xff09;1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字2. static成员2.1 概念特性类中成员变量区别&#xff08;普通变量和static变量&#xff09;:普通成员函数和静态成员函数的区别3. 友元友元函数友元类cout打印自定义类型…

24种代码坏味道和重构手法

最近&#xff0c;小李感觉公司女生们看他的眼神不太对劲了&#xff0c;那种笑容好像是充满慈爱的、姨母般的笑容。 作为一名老实本分的程序员&#xff0c;小李不太习惯这种被人过度关注的感觉&#xff0c;他不知道发生了什么。 小李和小王的关系似乎过于亲密&#xff0c;还经…

ZooKeeper 安装

ZooKeeper 安装 1. 下载安装 1、环境准备 ZooKeeper服务器是用Java创建的&#xff0c;它运行在JVM之上。需要安装JDK 7或更高版本。 2、上传 将下载的ZooKeeper放到/opt/ZooKeeper目录下 #上传zookeeper altp put f:/setup/apache-zookeeper-3.5.6-bin.tar.gz #打开 opt目…

(十)devops持续集成开发——jenkins流水线发布一个docker harbor仓库版的后端maven项目

前言 本节内容我们使用jenkins流水线组件发布一个docker环境的后端maven项目&#xff0c;并使用docker的harbor仓库完成镜像的存储&#xff0c;通过拉取harbor仓库中的项目镜像&#xff0c;完成后端项目的发布&#xff0c;关于harbor仓库的搭建&#xff0c;可以参考往期博客内…

Python学习笔记之模块

可迭代对象 概念&#xff1a;更新换代&#xff0c;每次更新都是根据上一次的结果作为基础。 有哪些&#xff1a;字符串&#xff0c;列表&#xff0c;字典&#xff0c;元组&#xff0c;集合&#xff0c;文件对象&#xff0c;特殊函数&#xff08;生成器&#xff09; 迭代器对…

软件测试/测试开发 | AppCrawler 自动遍历测试工具实践(一)

本文为霍格沃兹测试学院学院学员课程学习笔记。 公众号搜索&#xff1a;TestingStudio 霍格沃兹的干货都很硬核 AppCrawler 是由霍格沃兹测试学院校长思寒开源的一个项目&#xff0c;通过名字我们大概也能猜出个方向&#xff0c;Crawler 是爬虫的意思&#xff0c;App 的爬虫&am…

GitHub上标星79K的LeetCode算法小抄开放下载了

在大厂面试中我们不可避免的会考到算法&#xff0c;为什么大厂一定要考察算法呢&#xff1f;因为它包含了太多的逻辑思维&#xff0c;可以考察你思考问题的逻辑和解决问题的能力&#xff1b;这一点也是面试官比较看重的&#xff0c;因为它可以反映出你的潜力&#xff0c;我曾经…

Qt布局管理器(QHBoxLayout,QVBoxLayout)

文章目录布局管理器是什么使用代码添加布局管理器QVBoxLayoutQHBoxLayout使用ui文件添加布局管理器布局管理器的嵌套提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 布局管理器是什么 可以把一些组件按一定的次序排列&#xff0c;这就是布局管理器。 他…

反欺诈指南|网购平台如何保障公平交易

网购平台是社会零售重要的组成部分。国家统计数据显示&#xff0c;2021年&#xff0c;全国实物商品网上零售额达10.8万亿元&#xff0c;占社会消费品零售总额的比重为24.5%&#xff0c;对社会消费品零售总额增长的贡献率为23.6%。 网购平台促成买卖双方交易而建立的平台&#…

OpenBMI运动想象--认知科学实践设计

目录 一、简要介绍 &#xff08;一&#xff09;材料与准备工具 数据集下载 工具箱下载 参考 &#xff08;二&#xff09;OpenBMI工具箱介绍 &#xff08;三&#xff09;数据集详细介绍 数据拆分 数据解读 二、预处理 &#xff08;一&#xff09;目标 &#xff08;二&#xff09…

Linux安装和入门

文章目录1、课程介绍2、为什么需要Linux3、Linux简介3.1、什么事Linux3.2、Linux优点3.3、常见的Linux系统3.4、小结4、虚拟机安装4.1、引入4.2、常见的虚拟机软件4.3、安装vmware4.4、vmware常用操作4.4.1、全局配置虚拟机(Linux系统)存储位置4.4.2、虚拟机操作5、CentOS安装5…

Python中的消息框对话框tkinter.messagebox

介绍&#xff1a;使用&#xff1a;选择消息框的模式:提示消息框:【返回”ok”】消息警告框【返回”ok”】&#xff1a;错误消息框【返回”ok”】&#xff1a;对话框&#xff1a;询问确认对话框【返回值&#xff1a;yes/no】确认/取消对话框【返回值&#xff1a;True/False】是/…

【Java集合】Set接口及系列子类HashSet等

文章目录Set接口> Set 接口和常用方法> Set接口实现类 - HashSetHashSet 底层机制&#xff08;HashMap&#xff09;> Set接口实现类 - LinkedHashSetSet接口 Set 接口介绍&#xff1a; 无序&#xff08;添加和取出的顺序不一致&#xff09;&#xff0c;没有索引&…

交叉开发环境搭建

ubuntu网络环境搭建 配置网络环境有很多种方法&#xff0c;可以用命令行也可以用图形化界面。ip可以是静态的也可以是动态的。当然要是用SSH访问的话要配置成静态的&#xff0c;但是用校园网的话&#xff0c;又要是动态的&#xff0c;这里就不详细说了。 我们配置ubuntu是为了能…

Java学习路线图(2023版,视频已更新)

PS&#xff1a;注意收藏&#xff0c;此套路线图会不定期更新!点这里跳转&#xff1a;2023年Java程序员学习路线图入门&#xff1a; Java SE基础 → Java Web(含数据库H5jsvue)中级&#xff1a; Maven → Git → SSM框架 → MybatisPlus → Spring Boot→ 《传智健康》项目实战 …

北大硕士LeetCode算法专题课-基础算法查找

算法专题系列&#xff1a; 北大硕士LeetCode算法专题课---算法复杂度介绍_骨灰级收藏家的博客-CSDN博客 北大硕士LeetCode算法专题课-基础算法之排序_骨灰级收藏家的博客-CSDN博客 查找算法 查找算法也可以叫搜索算法。 查找算法就是从一个有序数列中找出一个特定的数&am…