使用 Visual Studio Code 搭建 C/C++ 开发和调试环境

3

1. 安装 C/C++ 插件

C/C++ 是由 Microsoft 发布的支持 C/C++ 智能提示和调试等功能的插件,安装步骤如下:

  • 使用快捷键 Ctrl + Shift + X 呼出扩展面板
  • 在搜索框中输入:C/C++
  • 再安装由 Microsoft 提供的名为 C/C++ 插件。

图片描述

2. 安装 MinGW-w64 并配置好环境变量

首先下载 MinGW-w64 点这里下载 MinGW-w64 。下载完成之后我们开始安装 MinGw-w64,安装路径可以自由定义,我这里安装路径为 D:\App\MinGW 。安装时需要设置的安装选项如下:

  • Version :GCC 版本,直接选最高;
  • Architecture :CPU 架构,系统如果为64位,则选择 x86_64;
  • Threads :API 模式,使用默认选项;
  • Exception :异常处理方式,seh 仅针对 64 位架构,sjlj 则兼容 32 位架构;
  • Build revision :修订版本,使用默认选项;

图片描述

安装过程中需要联网下载部分文件,由于网络问题安装失败的,可以 点这里下载 免安装版本。下载后直接解压在你想安装的文件夹。

然后我们要在安装路径中找到 bin 文件夹,通常在 ${MinGW-w64安装位置}\mingw64\bin ,以我的安装路径为例,bin 文件夹位于 D:\App\MinGW\mingw64\bin

接下来,我们将刚刚获取的 bin 文件夹的路径添加到系统环境变量。

  • Win + R 键,打开运行窗口,,输入 sysdm.cpl 并回车;
  • 在弹出的 系统属性 窗口,选择 高级 选项卡;
  • 高级 选项卡找到 环境变量 按钮,单击 环境变量 按钮,打开 环境变量 窗口 ;
  • 环境变量 窗口的 系统变量 区域找到 Path 变量 ,双击 Path 出现 编辑环境变量 窗口;
  • 编辑环境变量 窗口点击 新建,在新建的这行输入我们刚刚获取的 bin 文件夹的路径,然后点确定。

图片描述

3. 测试环境变量是否配置正确

在命令行输入 gcc --version,如果返回的是已安装的 gcc 的版本信息,那么环境变量就配置正确了。

下面是在我的电脑上输入 gcc --version 的结果,可以看到我安装的版本为:gcc 7.3.0

PS C:\Users\Jason> gcc --version
gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

4. 创建和设置 C 语言开发工作区

在你的计算机中选择一个合适的位置,作为你的 C 语言开发工作区。建议工作区所在路径仅由字母、数字、下划线组成,不要包含其他的符号。例如空格,空格符号常常作为命令行中命令和参数的间隔符,如果路径包含空格会导致编译时出错。我创建的工作区的路径为:D:\Study\C\WorkSpace

由于 Windows 中文版命令行输出字符是 GB2312 编码的,而 VS Code 工作区默认是 UTF-8 ,这会导致你编写的 C 代码编译后在命令行执行并查看结果时中文会显示乱码,所以我们要单独针对工作区进行设置字符编码,保证程序输出的字符也采用跟命令行一致的 GB2312 编码,步骤如下:

  • 使用 VS Code 打开你创建的工作区;
  • 在 VS Code 左下角的设置按钮进设置,再点击 用户设置 旁边的 工作区设置
  • 工作区设置 中添加 "files.encoding":"gb2312"

图片描述

5. 编写你的第一个 C 语言程序

在工作区新建一个 C 语言源文件命名为 hello.c ,输入以下内容:

#include <stdio.h>
#include <windows.h>
int main()
{
    printf("hello world!/n");
    system("pause");
}

6. 配置导入的头文件参数 c_cpp_properties.json

在编写完毕并保存之后,你可能会看到 #include 这句下面会有绿色波浪线,这是由于编译器没办法找到你所使用的头文件的所在位置。将光标移动到该行,行号左边会出现 黄色小灯泡 ,点击会出现一个提示按钮:Add include path to setting ,继续点击该提示,则会在工作区 .vscode 下生成 c_cpp_properties.json 文件。将文件修改成下面内容:

{
    "configurations": [{
        "name": "MinGW",
        "intelliSenseMode": "gcc-x64",
        "compilerPath": "D:/App/MinGW/mingw64/bin/x86_64-w64-mingw32-gcc.exe",
        "cStandard": "c11",
        "cppStandard": "c++17",
        "includePath": [
            // 下面路径中的 D:/App/MinGw 部分需要替换成你的 MinGw-w64 安装路径
            "${workspaceFolder}/**",
            "D:/App/MinGW/mingw64/x86_64-w64-mingw32/include",
            "D:/App/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++",
            "D:/App/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/tr1"
        ],
        "defines": [
            "_DEBUG",
            "UNICODE",
            "_UNICODE",
            "__GNUC__=7",
            "__cdecl=__attribute__((__cdecl__))"
        ],
        "browse": {
            "path": [
                // 下面路径中的 D:/App/MinGw 部分需要替换成你的 MinGw-w64 安装路径
                "${workspaceFolder}/**",
                "D:/App/MinGW/mingw64/x86_64-w64-mingw32/include",
                "D:/App/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++",
                "D:/App/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/tr1"
            ],
            "limitSymbolsToIncludedHeaders": true,
            "databaseFilename": ""
        }
    }],
    "version": 4
}

留意带注释部分的内容,需要将路径修改成你自己的安装路径哦。

7. 配置调试程序 launch.json

打开已经编写好的 hello.c ,然后按 F5 调试。因为是第一次调试,系统会弹出 选择环境 面板,这里选择 C++(GDB/LLDB)

图片描述

选择运行环境后,VS Code 会在工作区 .vscode 文件夹下创建 luanch.json 模板文件并打开,将文件内容清空,复制下面的内容到文件中并保存:

{
    "version": "0.2.0",
    "configurations": [{
        // 配置 VS Code 调试行为:
        "name": "GDB Debug", // 设置在启动配置下拉菜单中显示调试配置的名称。
        "preLaunchTask": "Compile", // 调试会话开始前要运行的任务。
        "type": "cppdbg", // 设置要使用的基础调试器。使用 GDB 或 LLDB 时必须是 cppdbg 。
        "request": "launch", // 设置启动程序还是附加到已经运行的实例。启动或附加 ( launch | attach ).
        "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 调试器将启动或附加的可执行文件的完整路径。
        "externalConsole": true, // 设置是否显示外部控制台。
        "logging": { // 用于确定应该将哪些类型的消息记录到调试控制台。
            "exceptions": true, // 是否应将异常消息记录到调试控制台。默认为真。
            "moduleLoad": false, // 是否应将模块加载事件记录到调试控制台。默认为真。
            "programOutput": true, // 是否应将程序输出记录到调试控制台的可选标志。默认为真。
            "engineLogging": false, // 是否应将诊断引擎日志记录到调试控制台。默认为假。
            "trace": false, // 是否将诊断适配器命令跟踪记录到调试控制台。默认为假。
            "traceResponse": false // 是否将诊断适配器命令和响应跟踪记录到调试控制台。默认为假。
        },
        // 配置目标应用程序:
        "args": [], // 设置调试时传递给程序的命令行参数。
        "cwd": "${workspaceFolder}", // 设置调试器启动的应用程序的工作目录。
        "environment": [], // 设置调试时添加到程序环境中的环境变量,例如: [ { "name": "squid", "value": "clam" } ]。
        // 自定义 GDB 或者 LLDB:
        "windows": {
            "MIMode": "gdb", // 指定 VS Code 连接的调试器,必须为 gdb 或者 lldb。
            "miDebuggerPath": "D:/App/MinGW/mingw64/bin/gdb.exe" // 调试器的路径,修改为你的安装路径
        },
        "miDebuggerArgs": "", // 传递给调试器的附加参数
        "stopAtEntry": false, // 设置调试器是否停止在目标的入口(附加时忽略)。默认值为 false。
        "setupCommands": [{ // 执行下面的命令数组以设置 GDB 或 LLDB
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing", // 鼠标悬停查看变量的值,需要启用 pretty-printing 。
            "ignoreFailures": true // 忽略失败的命令,默认为 false 。
        }]
    }]
}

留意 luanch.json 中的注释内容,记得把 "miDebuggerPath" 参数修改成你自己安装位置里的 gdb.exe

gdb.exe 位于 {MinGW-w64安装位置}\mingw64\bin 下面。

8. 配置调试前执行的任务 task.json

再按一次 F5 ,会弹出“找不到任务”的提示窗口,点击 配置任务 按钮,如下图所示:

图片描述

然后在弹出的命令面板选择 使用模板创建 task.json 文件 ,如下图所示:

图片描述

继续选择 Others 运行任意外部命令的示例 ,如下图所示:

图片描述

完成以上步骤之后,会在工作区的 .vscode 目录下生成 tasks.json 文件,并自动打开 task.json 文件。

图片描述

接下来我们将 task.json 文件内容清空,复制下面的内容到文件中并保存:

{
    // 有关 tasks.json 格式的参考文档:https://go.microsoft.com/fwlink/?LinkId=733558 。
    "version": "2.0.0",
    "tasks": [{
        "label": "Compile",
        "type": "shell", // { shell | process }
        // 适用于 Windows 的配置:
        "windows": {
            "command": "gcc",
            "args": [
                "-g",
                "\"${file}\"",
                "-o",
                "\"${fileDirname}\\${fileBasenameNoExtension}.exe\""
                // 设置编译后的可执行文件的字符集为 GB2312:
                // "-fexec-charset", "GB2312"
                // 直接设置命令行字符集为 utf-8:
                // chcp 65001
            ]
        },
        // 定义此任务属于的执行组:
        "group": {
            "kind": "build", // { build | test }
            "isDefault": true // { true | false }
        },
        // 定义如何在用户界面中处理任务输出:
        "presentation": {
            // 控制是否显示运行此任务的面板。默认值为 "always":
            // - always:    总是在此任务执行时显示终端。
            // - never:     不要在此任务执行时显示终端。
            // - silent:    仅在任务没有关联问题匹配程序且在执行时发生错误时显示终端
            "reveal": "silent",
            // 控制面板是否获取焦点。默认值为 "false":
            "focus": false,
            // 控制是否将执行的命令显示到面板中。默认值为“true”:
            "echo": false,
            // 控制是否在任务间共享面板。同一个任务使用相同面板还是每次运行时新创建一个面板:
            // - shared:     终端被共享,其他任务运行的输出被添加到同一个终端。
            // - dedicated:  执行同一个任务,则使用同一个终端,执行不同任务,则使用不同终端。
            // - new:        任务的每次执行都使用一个新的终端。
            "panel": "dedicated"
        },
        // 使用问题匹配器处理任务输出:
        "problemMatcher": {
            // 代码内问题的所有者为 cpp 语言服务。
            "owner": "cpp",
            // 定义应如何解释问题面板中报告的文件名
            "fileLocation": [
                "relative",
                "${workspaceFolder}"
            ],
            // 在输出中匹配问题的实际模式。
            "pattern": {
                // The regular expression.
                "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                // 第一个匹配组匹配文件的相对文件名:
                "file": 1,
                // 第二个匹配组匹配问题出现的行:
                "line": 2,
                // 第三个匹配组匹配问题出现的列:
                "column": 3,
                // 第四个匹配组匹配问题的严重性,如果忽略,所有问题都被捕获为错误:
                "severity": 4,
                // 第五个匹配组匹配消息:
                "message": 5
            }
        }
    }]
}

9. 完成

到这里,C 开发环境就已经配置完毕。接下来我们在 hello.c 的编辑窗口按 F5 运行下,看下效果。

图片描述

如果你还想再创建其他的 C 语言开发工作区,我们只需要新建一个文件夹,再把现在已有工作区目录下的 .vscode 文件夹复制到新建的文件夹即可。


如果觉得我的文章对你有用,请随意赞赏
已赞赏

你可能感兴趣的

16 条评论
von33 · 5月22日

你好,为什么我按照你的方法配置了,最后会显示“找不到任务compile”?

回复

0

task.json 和 launch.json 里的内容你可能哪里写错了。

JasonHe 作者 · 5月23日
0

我把msvc改成clang就可以了,但是找不到头文件stdio.h,但是可以编译,是怎么回事

von33 · 5月23日
0

本文第6部分有讲配置头文件导入的设置,直接将你的头文件的路径配置到 c_cpp_properties.json 里面

JasonHe 作者 · 5月25日
skybowtw · 11月8日

你好,我三個.json檔完全copy你的設定,但按下F5後,
一直出現 The terminal process terminated with exit code: 2
Terminal will be reused by tasks, press any key to close it.

我的環境:
OS: Win7 64bit,
VSCode版本:1.8.2
C/C++ Extension版本:0.20.1
已安裝MinGW-64。已配置好PATH环境变量。

在命令行直接輸入
gcc -g "d:\VscodeCpp\src\main.cpp" -o "d:\VscodeCpp\src\main.exe",
可以成功編譯出exe檔,也可執行!
但在VSCode中就會出錯!

請問有可能是哪要修改?

回复

0

这个问题跟task中的,shell是否共享有关,你可以稍等,我晚一点上传新的版本的文章。

JasonHe 作者 · 11月8日
0

最新版文章参考个人博客:https://hovenjay.github.io/20...

JasonHe 作者 · 11月8日
0

sorry!我知道原因了!
因為我多安裝了一個Extension【Easy C++ projects】,
這個Extension的命令"Create new c++ project"會自動產生所需的4個.json檔案,
其中包含一個workspace的settings.json,
內部有一行: "terminal.integrated.shell.windows": "cmd.exe",
它會覆蓋VSCode的User Settings預設值,
"terminal.integrated.shell.windows": "C:\Windows\system32\cmd.exe",

所以無法成功開啟命令行。
把此settings.json刪掉就可以成功運作了!

謝謝您!

skybowtw · 11月9日
燕儿 · 11月20日

您好,我按照您的方式出现了下面的:
gcc : 无法将“gcc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名
称的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1

  • gcc -g e:visual stdio code.vscodeUntitled-1.cpp -o e:visual stdio ...

Exception

+ FullyQualifiedErrorId : CommandNotFoundException

终端进程已终止,退出代码: 1

终端将被任务重用,按任意键关闭。

回复

0

说明没有把 GCC 配置到环境变量中。如果成功配置到环境变量中的话,则不会出现这种提示的。

JasonHe 作者 · 11月30日
AmosLee94 · 12月5日

调试的时候,会打开一个外部的cmd,不想用外部的,设置"externalConsole": false,vscode内部的终端,并不会显示代码中printf输出的内容,有办法解决吗

回复

0

这个设置只能设置是否显示外部控制台,并不是说你禁用了就可以在内部控制台显示。目前支持在内部控制台执行 C 语言程序,但是不支持在内部控制台使用调试扩展。使用 Code Runner 插件设置好编译命令,可以快速的编译执行 C 语言程序。你可以尝试一下。

JasonHe 作者 · 12月5日
恒之 · 1 天前

您好,配置完之后,F5与ctrl+F5都会出现控制台闪退,请问该怎么解决呢?只能用system("pause)么?

回复

0

不是闪退,是程序执行完毕会自动退出,想保持控制台请用 system("pause") 或者在程序结束的地方打断点。

JasonHe 作者 · 1 天前
0

不能通过配置文件来实现么?

恒之 · 1 天前
0

暂时没发现有通过配置文件实现的方式

JasonHe 作者 · 9 小时前
载入中...