VS Code:Windows下编写运行C/C++程序(GCC)

2021-03-30 06:26

阅读:392

标签:watch   debug   output   复制   external   cti   use   运行   单词   

VS Code:Windows下编写运行C/C++程序(GCC)

安装Visual Studio Code

在VS Code中安装 C/C++扩展(快捷键:Ctrl+Shift+X)

技术图片

安装Mingw-w64

下载地址:https://sourceforge.net/projects/mingw-w64/files/

  • 方法一:直接下载在线安装器(国内网络不推荐)
    技术图片

    1. 运行安装包。
    2. Architecture选择x86_64,然后Next。
    3. 使用默认安装文件夹继续Next,安装MinGW。
  • 方法二:下载最新版本的x86_64-posix-seh
    技术图片
    1. 解压下载的压缩包到自己想要安装的路径下就算安装完成。

配置环境变量

  1. 复制“mingw64\bin”所在的路径。
  2. 右键此电脑->属性->高级系统设置->高级->环境变量。
  3. 在系统变量中找到Path,双击或选中点击编辑,在编辑环境变量窗口选择新建,输入bin文件夹所在路径(本机解压到的路径:C:\Program Files\mingw64)。
  4. 点击确定保存修改。

验证

命令提示符中运行以下命令查看是否有预期输出,以验证MINGW是否正确安装:

g++ --version
gdb --version

技术图片

创建Hello World

通过命令提示符,创建project空文件夹用于存放VS Code项目。然后打开该文件夹,在其下创建helloword子文件夹,导航到这个子文件夹,并输入code .在该文件夹下打开VS Code。命令如下:

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

code .命令在当前文件夹下打开了VS Code,该文件夹成为了你的“工作空间”。通读教程后,你将看见工作空间的.vscode文件夹下创建了三个文件:

  • task.json(搭建说明)
  • launch.json(调试器设置)
  • c_cpp_properties.json(编译器路径和智能提示设置)

添加源代码文件

在"文件资源管理器"标题栏中,选择"New File"按钮并命名文件为helloworld.cpp
技术图片

添加hello world源代码

复制下列代码:

#include 
#include 
#include 

using namespace std;

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

    for (const string& word : msg)
    {
        cout 

Ctrl+S进行保存。注意刚刚添加的文件是怎样出现在VS Code侧边栏的File Explorer视图(Ctrl+Shift+E)中的:
技术图片

你也可以启用Auto Save来自动保存文件的改变,通过选中File下的Auto Save

最左边的活动栏用于打开不同的视图,比如Search,Source Control, 和Run。本教程后面的部分你会看到Run视图。你可以在VS Code用户界面文档中找到更多关于其他视图的信息。

便笺:当你保存或添加一个C++文件,你可以看见一个来自C/C++扩展关于内部版本可用性的通知,你可以用来测试新的特性和修正。

探索智能提示

在你新的helloworld.cpp文件中,鼠标悬停在vector或者string可以查看类型信息。在声明msg变量后,像调用成员函数一样开始键入msg.。你可以立刻看到一个显示所有成员函数的补全列表,和一个显示msg对象类型信息的窗口:
技术图片
你可以按Tab键来插入已选择的成员;然后,当你添加左括号时,你会看见关于这个函数所需的所有参数的信息。

构建helloworld.cpp

接下来,你需要创建一个task.json文件告诉VS Code怎样构建(编译)程序。这个任务将通过g++编译器创建一个基于源代码的可执行文件。

从主菜单栏选择Terminal > Configure Default Build Task。下拉列表将会展示C++编译器的各种预定义的构建活动下拉清单。选择g++.exe build active file将生成当前在编辑器中显示(活动)的文件。

技术图片

这会在.vscode文件夹下创建一个task.json文件并在编辑器中打开。

你的新task.json文件应该类似于下面的JSON:

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "C/C++: g++.exe build active file",
      "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe",
      "args": ["-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe"],
      "options": {
        "cwd": "${workspaceFolder}"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

command设置指定了要运行的程序;本例是g++。args数组指定要传给 g++ 的命令行参数。这些参数必需按照编译器预期的顺序指定。这个任务告诉g++获取活动文件(${file}),编译它,并在当前目录创建一个名字和活动文件一样但扩展名是.exe${fileBasenameNoExtension}.exe)的可执行文件(${fileDirname}),我们的示例结果是helloworld.exe

便笺:关于task.json变量,你可以在变量查询中了解更多。

label的值是你将在任务列表中看到的值;你可以命名成任何你喜欢的名字。
group对象中"isDefault": true的值规定了当你按下Ctrl+Shift+B时这个任务将会被运行。这个属性只是为了方便,如果你设置为false,你依然可以在Terminal菜单中用Run Build Task运行它。

运行构建

  1. 回到helloworld.cpp。你的任务构建活动文件并且你要构建helloworld.cpp.
  2. 运行task.json中定义的构建任务,按Ctrl+Shift+B或者从Terminal主菜单选择Run Build Task
  3. 当任务开始时,你需要查看源代码编辑器下方的集成终端面板(TERMINAL)。任务完成后,终端显示编译器用来表示是否构建成功的输出。对于成功的g++构建,输出如下:
    技术图片
  4. +按钮创建一个新的终端,你将会获得一个以helloworld文件夹为工作目录的新终端。运行dir你会看到可执行的helloworld.exe
    技术图片
  5. 你可以键入helloworld.exe(或者.\helloworld.exe如果你使用PowerShell终端)在终端运行helloworld

修改tasks.json

你可以使用参数像"${workspaceFolder}\\*.cpp"而不是${file}来修改你的tasks.json以构建多个C++文件。这将在你当前的文件夹构建所有的.cpp文件。你也可以通过用一个硬编码文件名(例如"${workspaceFolder}\\myProgram.exe")来替换"${fileDirname}\\${fileBasenameNoExtension}.exe"以修改输出文件名

调试 helloworld.cpp

接下来,你将创建一个launch.json文件来配置VS Code以在你按F5调试程序的时候启动 GDB 调试器。
1. 在主菜单选择Run>Add Configuration...然后选择C++(GDB/LLDB)。
2. 然后你会看到一个多种预定义调试配置的下拉列表。选择g++.exe build and debug active file
技术图片
VS Code创建 launch.jsonfile 文件,在编辑器中打开它,并构建运行“helloworld”。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "g++.exe - Build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gdb.exe",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "C/C++: g++.exe build active file"
    }
  ]
}

program指定想要调试的程序。这里设置为活动文件文件夹${fileDirname}和扩展名为.exe的活动文件名${fileBasenameNoExtension.exe},如果helloworld.cpp是活动文件将会生成helloworld.exe
默认下,C++扩展不会在你的源代码添加任何断点,并且stopAtEntry的被值设置为false
改变stopAtEntry的值为true以在你启动调试器时让调试器停止在main方法上。

便笺:preLaunchTask用于指定在启动之前要被执行的任务。确保它华为task.json文件的label设置一致。

启动一个调试会话

  1. 回到helloworld.cpp使其成为活动文件。
  2. F5或从主菜单选择Run > Start Debugging。在开始单步执行源代码之前,让我们花点时间注意一下用户界面的几个变化:
  • 集成终端显示在源代码编辑器的底部。在Debug Output选项卡中,可以看到指示调试器已启动并正在运行的输出。
  • 编辑器突出显示main方法中的第一条语句。这是C++扩展自动为您设置的断点:
    技术图片
  • 左侧的运行视图显示调试信息。您将在后面的教程中看到一个示例。
  • 在代码编辑器的顶部,将显示调试控制面板。你可以通过抓取左边的点在屏幕上移动这个。

单步执行代码

现在您可以开始单步执行代码了。

  1. 单击或按调试控制面板中的Step over图标。
    技术图片
    这将推进程序执行到for循环的第一行,并在msg变量被创建和初始化时跳过所有涉及到的,在vectorstring类中的内部函数的调用。注意左侧Variables窗口的改变。
    技术图片
    在本例中,错误时预期的,尽管循环变量名对调试器现在是可见的,语句尚未执行,所以此时没有可读取的。然而,msg的内容是可见的,因为该语句已经完成。

  2. 再次按下Step over前进到这个程序的下一个语句(跳过所有用于初始化循环而被执行的内部代码)。现在,Variables窗口显示有关循环变量的信息。

  3. 再次按下Step over来执行count语句。(注意截至2019年三月发行的版本,C++扩展不在Debug Consle打印任何输出直到退出循环。)

  4. 如果你愿意,可以一直按Step over,直到vector中所有单词都被打印到控制台。但是如果你好奇,试着按下Step Into按钮在C++标准库里来单步执行源代码。
    技术图片
    要返回你自己的代码,一种方式是继续按Step over。另一种方式是通过在编辑器中切换到hellworld.cpp标签在你的代码设置一个断点,将插入点放在循环内count语句上的某个位置,并按F9。左侧空白处会出现一个红色的点表示这行设置了一个断点。
    技术图片
    然后按F5来从标准库标题的当前行开始执行。执行将在cout处中断。如果你愿意,你可以再按F9关闭断点。
    当循环完成时,你可以在集成终端看见输出,以及一些其他由GDB输出的诊断信息。
    技术图片

设置监视

有时你可能想在程序执行的时候追踪变量的值。你可以通过在变量上设置监视来做到这一点。

  1. 在循环内放置插入点。在Watch窗口,点击加号并在文本框中键入word,这是循环变量的名称。现在在单步执行循环时查看监视窗口。
    技术图片
  2. 通过在循环前添加这个语句添加另一个监视:int i = 0;。然后,在循环内,添加这个语句:++i;。现在像你上一步做的那样为i添加监视。
  3. 快速观察当执行通过断点时变量的值。你可以用鼠标指针悬停在它上面。
    技术图片

C/C++配置

如果你想要对C/C++扩展有更好的控制,你可以创建一个c_cpp_properties.json文件,允许你改变设置,例如编译器的路线,包括路径、C++标准(默认是C++17)等。
你可以从Command Palette (Ctrl+Shift+P)通过运行命令C/C++: Edit Configurations (UI)查看C/C++配置UI。
技术图片
这打开了C/C++ Configurations页面。当你对这里进行变更时,VS Code将它们写入一个在.vscode文件夹中,名为c_cpp_properties.json的文件。
这里,我们将Configuration name改为GCC,设置Compiler path下拉列表到g++编译器,IntelliSense mode与编译器(gcc-x64)匹配。
技术图片
Visual Studio Code 将这些设置放在.vscode\c_cpp_properties.json。如果你直接打开这个文件,它大致如下:

{
  "configurations": [
    {
      "name": "GCC",
      "includePath": ["${workspaceFolder}/**"],
      "defines": ["_DEBUG", "UNICODE", "_UNICODE"],
      "windowsSdkVersion": "10.0.18362.0",
      "compilerPath": "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe",
      "cStandard": "c11",
      "intelliSenseMode": "gcc-x64"
    }
  ],
  "version": 4
}

你只需要添加到Include path数组设置如果你的程序包括不在你的工作空间或在标准库路径的头文件。

编译器路径

扩展使用compilerPath设置来推断C++标准库头文件的路径。当扩展直到在哪里可以找到这些文件时,它会提供诸如智能补全和Go to Definition导航。

C/C++扩展尝试用基于它在系统中找到的默认编译器位置来填充compilerPath。该扩展在几个常见的编译器位置查找。

compilerPath搜索顺序为:

  • 首先检查Microsoft Visual C++编译器
  • 然后在Windows子系统 for Linux(WSL)上查找g++
  • 然后是Mingw-w64的g++。

如果你安装了Visual Studio或者WSL,你或许需要变更compilerPath来为你的项目匹配首选编译器。例如,如果你安装了使用i686架构的Mingw-w64 8.1.0 版本,Win32线程,sjlj异常处理安装选项,路径应该是这样的C:\Program Files (x86)\mingw-w64\i686-8.1.0-win32-sjlj-rt_v6-rev0

下一步

  • 浏览VS Code User Guide
  • 回顾Overview of the C++ extension.
  • 创建一个新的工作空间,复制你的.vscodeJSON文件到这,调整新工作空间路径的必要设置,项目名称,等等,并开始编码!

参考:

  1. 翻译自:Using GCC with MinGW
  2. Visual Studio Code 如何编写运行 C、C++ 程序?

VS Code:Windows下编写运行C/C++程序(GCC)

标签:watch   debug   output   复制   external   cti   use   运行   单词   

原文地址:https://www.cnblogs.com/kihyou/p/13566590.html

上一篇:KMP算法

下一篇:39. 逆转数组(二)


评论


亲,登录后才可以留言!