搭建windows下基于VSCode的C++编译和调试环境

news2024/11/16 19:31:55

VSCode是目前比较流行的IDE,因为它插件丰富,依据需求扩展,非常方便。

本文记录搭建windows下基于VSCode的C++编译和调试环境的过程。

网上关于此问题的帖子比较多,找了好几个也没有试验成功,最后发现还是按照VScode的官方文档搭建最靠谱,解释得也更准确。所有下面主要是翻译官方文档。原文链接为Get Started with C++ and Mingw-w64 in Visual Studio Code

在本教程中,您将Visual Studio Code配置为使用mingw-w64中的GCC C++编译器(g++)和GDB调试器来创建在Windows上运行的程序。

配置VS Code后,您将在VS Code中编译和调试一个简单的Hello World程序。本教程不教您GCC、GDB、明w-w64或C++语言。对于这些主题,网络上有许多很好的资源。

如果您有任何问题,请随时在VS Code文档存储库(Issues · microsoft/vscode-docs · GitHub)中提交本教程的问题。

  • 准备工作

1、安装VSCode

2、安装C/C++ 扩展插件

        在VSCode“扩展”中搜索“ C/C++ extension for VS Code”,如下所示,然后安装

3、安装MinGW

        参见我另一篇文章cmake创建windows工程编译环境_qijitao的博客-CSDN博客

  • 检查MinGW安装情况

打开cmd,并输入如下命令,如果出现版本信息说明安装正常,否则检查安装路径及PATH环境变量是否匹配。

gcc --version
g++ --version
gdb --version

创建Hello World

先创建HelloWorld工程目录,如下所示,可以根据自己的情况而定,但是同一个工程的所有文件及子文件夹都放在同一个根目录下,本例为helloworld文件夹:

        

 在此根文件夹下创建helloword.cpp文件,如下所示:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
}

然后vscode打开到helloworld文件夹。

在您学习本教程时,您将看到在工作区的.vscode文件夹中创建了三个文件:

  1. tasks.json (build instructions)
  2. launch.json (debugger settings)
  3. c_cpp_properties.json (compiler path and IntelliSense settings)

  • 运行 helloworld.cpp

请记住,C++扩展使用您在计算机上安装的C++编译器来构建程序。在尝试通过VS Code运行和调试helloworld.cpp之前,请确保安装了C++编译器(就是前面安装的MinGW)。

  1. 打开helloworld.cpp,使其成为活动文件。
  2. 按编辑器右上角的播放按钮。

  3. 从系统上检测到的编译器列表中选择C/C++: g++.exe构建和调试活动文件。  

    只有在第一次运行helloworld.cpp时,您才会被要求选择编译器。此编译器将被设置为tasks.json文件中的“默认”编译器。
  4. 构建成功后,程序的输出将出现在集成的终端中。

第一次运行程序时,C++扩展会创建tasks.json,您可以在项目的.vscode文件夹中找到它。tasks.json存储构建配置。

您的新tasks.json文件应类似于下面的JSON:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe 生成活动文件",
            "command": "D:\\wecode_build_tools\\mingw\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

其中的变量具体含义可以参见Visual Studio Code Variables Reference

command设置指定要运行的程序;在本例中,为g++。args数组指定将传递给g++的命令行参数。这些参数必须按编译器预期的顺序指定。

此任务告诉g++获取活动文件(${file}),编译它,并在当前目录(${fileDirname})中创建一个与活动文件同名但扩展名为.exe的可执行文件(${fileBasenameNoExtend}.exe),例如在我们的示例中是helloworld.exe。

标签(label)值是您将在任务列表中看到的;您可以为其命名任何您喜欢的值。

详细信息(detail)值是您将在任务列表中作为任务描述的值。强烈建议重命名此值,以将其与类似任务区分开来。

从现在开始,播放按钮将从tasks.json中读取,以确定如何构建和运行程序。您可以在tasks.json中定义多个构建任务,无论哪个任务被标记为默认值,播放按钮都将使用。如果您需要更改默认编译器,您可以运行任务:配置默认生成任务(Ctrl+shift+p触发命令行,然后输入Configure default build task,下面会有对应的提示,选择并修改它)。或者,您可以修改tasks.json文件并通过替换此段删除默认值:

    "group": {
        "kind": "build",
        "isDefault": true
    },

为:

   "group": "build",

  • 修改tasks.json

您可以修改tasks.json以生成多个C++文件,方法是使用"${workspaceFolder}/*.cpp"等参数而不是${file}。这将生成当前文件夹中的所有.cpp文件。您还可以通过将“${fileDirname}\${fileBasenameNoExtend}.exe”替换为硬编码的文件名(例如"${workspaceFolder}\\myProgram.exe")来修改输出文件名。

  • 调试 helloworld.cpp
  1. 返回helloworld.cpp,使其成为活动文件。
  2. 通过单击编辑器边距或在当前行上使用F9设置断点。helloworld.cpp中断点截图

  3. 从播放按钮旁边的下拉列表中,选择调试C/C++文件。播放按钮下拉列表的屏幕截图,播放按钮下拉列表的屏幕截图:

  4. 从系统上检测到的编译器列表中选择C/C++: g++构建和调试活动文件(只有在第一次运行/调试helloworld.cpp时,您才会被要求选择编译器)。C++调试配置下拉列表

播放按钮有两种模式:运行C/C++文件和调试C/C++文件。它将默认为上次使用的模式。如果您在播放按钮中看到调试图标,您可以只单击播放按钮进行调试,而不是使用下拉列表

调试到断点的界面:

  • 通过launch.json自定义调试信息

当您使用播放按钮或F5进行调试时,C++扩展会动态创建动态调试配置。

在某些情况下,您希望自定义调试配置,例如指定要在运行时传递给程序的参数。您可以在launch.json文件中定义自定义调试配置。

要创建launch.json,请从播放按钮下拉菜单中选择添加调试配置。

或者ctrl+shift+p输入Add debug configuration:

然后,您将看到各种预定义调试配置的下拉列表。选择C/C++: g++.exe构建和调试活动文件。

VS Code创建一个启launch.json文件,该文件看起来如下所示:

{
    "configurations": [
        {
            "name": "C/C++: g++.exe 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\wecode_build_tools\\mingw\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe 生成活动文件"
        }
    ],
    "version": "2.0.0"
}

在上面的JSON中,程序(program)指定要调试的程序。在这里,它被设置为活动文件夹(${fileDirname})和具有.exe扩展名的活动文件名(${fileBasenameNoExtension}.exe),如果helloworld.cpp是活动文件,则该文件将是helloworld.exe。args属性是在运行时传递给程序的参数数组。

默认情况下,C++扩展不会向源代码添加任何断点,并且stopAtEntry值设置为false。

将stopAtEntry值更改为true,以使调试器在开始调试时停止在main函数上。

从现在开始,在启动程序进行调试时,播放按钮和F5将从您的launch.json文件中读取。

  • C/C++ 配置

如果您希望对C/C++扩展有更多的控制,您可以创建一个c_cpp_properties.json文件,该文件将允许您更改设置,如编译器的路径、包括路径、C++标准(默认值为C++17)等。

您可以通过从命令面板(Ctrl+Shift+P)运行命令C/C++:编辑配置(UI)来查看C/C++配置UI。

这将打开C/C++配置页面。在此处进行更改时,VS Code会将它们写入.vscode文件夹中名为c_cpp_properties.json的文件中。

在这里,我们将配置名称更改为win32,将编译器路径下拉列表设置为g++编译器,并将IntelliSense模式设置为与编译器(windows-gcc-x64,依次表示操作系统平台-编译器-处理器架构)匹配。

 Visual Studio Code将这些设置放置在.vscode\c_cpp_properties.json中。如果直接打开该文件,它应该如下所示:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "D:\\wecode_build_tools\\mingw\\bin\\gcc.exe",
            "cStandard": "c17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}

如果程序包含不在工作区或标准库路径中的头文件,则仅需要添加到包含路径数组设置中。

  • 编译器路径

扩展使用编译器路径设置来推断C++标准库头文件的路径。当扩展知道在哪里可以找到这些文件时,它可以提供智能完成和转到定义导航等功能。

C/C++扩展尝试根据它在系统上找到的内容,使用默认编译器位置填充编译器路径。扩展在几个常见的编译器位置中查找。

编译器路径搜索顺序为:

1、Microsoft Visual C++编译器的第一次检查
2、然后在Windows子系统for Linux (WSL)上查找g++
3、然后g++代表明w-w64。
如果安装了Visual Studio或WSL,则可能需要更改编译器路径以匹配项目的首选编译器。例如,如果您使用i686体系结构、Win32线程和sjlj异常处理安装选项安装了Mingw-w64版本8.1.0,路径将如下所示:C:\Program Files (x86)\mingw-w64\i686-8.1.0-win32-sjlj-rt_v6-rev0\mingw64\bin\g++.exe。

现在你可以创建一个新的工作区,将.vscode JSON文件复制到其中,调整新工作区路径、程序名称等的必要设置,然后开始编码!

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

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

相关文章

揭秘阿里新大招:大模型只是前菜

技术的代际变革往往对商业格局产生深远影响。眼下&#xff0c;随着产业各界对大模型的投入布局加深&#xff0c;一个业界共识逐渐诞生&#xff1a;大模型正在改变云生态&#xff0c;将为云计算行业带来新的奇点。 在过去的一段时间里&#xff0c;市场研究机构IDC在2022年底的预…

Unity和Visual studio开发调试环境配置-工具插件安装和配置

在Unity开发中&#xff0c;常用C#脚本进行功能开发&#xff0c;需要用到Visual Studio进行开发和调试&#xff0c;需要分别在Unity3d和Visual Studio中安装插件和工具才能更好的进行开发和调试。 visual studio安装Unity扩展工具 visual studio中“工具”→“获取工具和功能”…

Leetcode.1019 链表中的下一个更大节点

题目链接 Leetcode.1019 链表中的下一个更大节点 Rating &#xff1a; 1571 题目描述 给定一个长度为 n 的链表 head 对于列表中的每个节点&#xff0c;查找下一个 更大节点 的值。也就是说&#xff0c;对于每个节点&#xff0c;找到它旁边的第一个节点的值&#xff0c;这个节…

[Python工匠]输出②数值与字符串

2.1 基础知识 2.1.1 数值基础 在Python中&#xff0c;一共存在三种内置数值类型&#xff1a;整型&#xff08;int&#xff09;、浮点型&#xff08;float&#xff09;和复数类型&#xff08;complex&#xff09;。 在大多数情况下&#xff0c;我们只需要用到前两种类型&#x…

SAR ADC系列23:异步SAR逻辑

异步sar逻辑的引入&#xff1a; 原因1&#xff1a;提高转换速度 ■ 同步时钟从第一个比较周期到最后一个比较周期长度都是相等的。对于Latch比较器&#xff0c;信号幅度越小&#xff0c;比较时间越长&#xff08;参考latch时域响应那一节&#xff09;。为了保证比较器…

Linux串口出厂测试工具与使用说明

1、说明 本文针对Linux系统上如何对各类串口硬件进行出厂测试进行硬件连接和软件使用说明&#xff0c;提供的软件测试工具wchsertest&#xff0c;适用于USB、PCI、PCIe转串口设备等、同样也适用于原生ttyS串口。 2、串口测试硬件连接 在测试前&#xff0c;需要制作单独的硬件…

寸照换底色技巧大全,超详细图文教程

在日常的设计工作中&#xff0c;我们常常需要将图片的背景色进行修改&#xff0c;以适应不同的场景和需求。其中最常用的方法就是寸照换底色技巧。本文将为大家介绍一些常见的寸照换底色技巧&#xff0c;并提供超详细的图文教程&#xff0c;帮助大家轻松完成这项任务。 一、使…

2023最新面试题-Java-6

1. Date API Java 8 在包java.time下包含了一组全新的时间日期API。新的日期API和开源的Joda-Time库差不多&#xff0c;但 又不完全一样&#xff0c;下面的例子展示了这组新API里最重要的一些部分&#xff1a; Clock类提供了访问当前日期和时间的方法&#xff0c;Clock是时区敏…

springboot加载命令行参数ApplicationArguments

往期文章 springcloud整合knike4j聚合微服务接口文档 spring源码 - 条件注解ConditionnalOnClass的原理分析 springboot项目实现导出pdf功能&#xff0c;这也太简单了吧 目录 文章目录往期文章目录一、介绍二、通过应用程序参数获取配置1. 通过bean获取应用程序参数2. 通过V…

在外web浏览器远程访问jupyter notebook服务器

文章目录前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口5. 固定公网地址转载自远控源码文章&#xff1a;公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&#…

我现在必须new一个对象!!!

目录 前言 1.new 2.delete 3.底层逻辑 4.定位new 5.对比 前言 &#x1f383;之前在使用C语言的时候&#xff0c;我们便使用 malloc 和 calloc 等函数进行动态内存的开辟。但 C 之中又引入了两个操作符 new 和 delete 来代替C语言中的函数进行动态内存的管理。下面就一起…

苏州源特VPT87DDF01B 隔离变压器 小体积/SMD/3000VDC 隔离

1 产品特点  小体积隔离变压器  隔离电压 3000VDC  工作温度&#xff1a;-40~125℃&#xff08;包含产品温升&#xff09;  存储温度&#xff1a;-55~125℃  SMD 表贴安装  回流焊温度&#xff1a;峰值温度≤250℃&#xff08;10s&#xff09;  回流焊次数&#…

Softing新版HART多路复用器软件支持西门子控制器

用于访问配置和诊断数据的HART多路复用器软件——Softing smartLink SW-HT&#xff0c;现在支持西门子的ET200远程IO和FDT/DTM接口。 smartLink SW-HT是一个基于Docker容器的软件应用。通过该软件&#xff0c;用户可以快速地访问以太网远程IO的HART设备&#xff0c;并且无需额外…

【Linux】进程间通信之管道(pipe)

文章目录前言为什么要进程间通信进程间通信的理论依据管道管道的原理创建匿名管道管道的特点管道的场景利用管道控制子进程命名管道命名管道的打开规则命名管道和匿名管道的区别用命名管道实现server和client通信前言 大家好久不见&#xff0c;今天开始我们将进入进程间通信章…

redis高可用方案:主从复制+哨兵模式,经典案例:一主二从三哨兵,及springboot集成配置

Redis高可用方案&#xff1a;主从复制哨兵模式 经典案例&#xff1a;一主二从三哨兵&#xff0c;及springboot集成配置 第一.配置 1.主节点配置&#xff08;redis.conf&#xff09; # 主节点配置 仅展示必要配置 redis.conf # 保护模式设置为关&#xff0c;方便其他节点访问…

推荐几款炫酷的 MySQL 可视化管理工具!好用到爆!!

MySQL 的管理维护工具非常多&#xff0c;除了系统自带的命令行管理工具之外&#xff0c;还有许多其他的图形化管理工具&#xff0c;工具好用是一方面&#xff0c;个人的使用习惯也很重要&#xff0c;这里介绍 13 款 MySQL 图形化管理工具&#xff0c;供大家参考。 1&#xff1a…

vite .env.test环境使用ant design vue ,打包后a-date-picker控件无法选择日期

前端开发后台管理系统&#xff0c;常用的UI库当属Element UI和 Ant Design Vue&#xff0c;但是前段时间遇到一个奇葩问题&#xff0c;在这里记录一下&#xff0c;防止小伙伴们踩坑。 后台系统&#xff0c;大家肯定都用过时间控件&#xff0c;本期我们使用的是ant design vue&…

2道关于chan的面试题

题目一: 下面关于通道描述正确的是: 1.读nil chan会触发panic 2.写nil chan会触发panic 3.读关闭的chan会触发panic 4.写关闭的chan会触发panic解答&#xff1a;这个提涉及到2个知识点&#xff0c;操作nil的chan会怎么样&#xff0c;操作关闭的chan会怎么样&#xff0c;下面我…

双目相机测距原理

双目相机测距是一种常用的计算机视觉技术&#xff0c;它利用两个摄像头同时拍摄同一场景&#xff0c;通过测量两个摄像头视野中同一物体在图像上的像素差异&#xff0c;从而计算出物体距离的方法。 具体原理如下&#xff1a; 双目相机的构成 双目相机由两个摄像头组成&#…

用ChatGPT怎么赚钱?普通人用这5个方法也能赚到生活费

ChatGPT在互联网火得一塌糊涂&#xff0c;因为它可以帮很多人解决问题。比如&#xff1a;帮编辑人员写文章&#xff0c;还可以替代程序员写代码&#xff0c;帮策划人员写文案策划等等。ChatGPT这么厉害&#xff0c;能否用它来赚钱呢&#xff1f;今天和大家分享用ChatGPT赚钱的5…