VS Code 配置 C/C++ 开发环境

一、软件下载

需要下载的软件如下:

  • VS Code
  • 编译工具:MinGW 或 MSYS2 或 VS2022

VS Code 下载地址:链接
MinGW 下载地址:链接 或者 链接
MSYS2 下载地址:链接
VS2022 下载地址:链接

上述软件下载完成以后安装步骤安装即可,编译工具建议选择MinGW。如果安装MinGW可以使用GCC编译器,而安装VS2022则可以使用MSVC编译器。

二、环境配置

1. 添加环境变量

MinGWbin 文件夹添加到系统的 PATH 环境变量中。如果在命令行中执行以下代码并无错误提示,则表面添加成功。

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

输出结果如下:
在这里插入图片描述

2. 安装 VS Code 插件

需要安装三个插件,分别是:

  • C/C++
  • C/C++ Extension Pack
  • Atom One Dark Theme (可选,用于代码主题颜色)

在这里插入图片描述

三、编译器参数

1. GCC

参数说明示例
-c只编译源文件,生成目标文件,不进行链接
-o 指定输出文件的名称-o build\${fileBasenameNoExtension}.exe
-I <include_path>添加头文件搜索路径-I ${workspaceFolder}/include
-L <library_path>添加库文件搜索路径-L ${workspaceFolder}/lib
-l <library_name>链接指定的库文件-lgdi32
-g生成调试信息
-std=指定使用的语言标准-std=c11、-std=c++14
-O指定优化级别,级别可以是0、1、2、3、s
-Wall显示所有警告信息
-Werror将警告视为错误
-pthread启用对多线程的支持
-lm链接数学库
-mwindows去掉控制台窗口

2. MSVC

参数说明示例
/c只编译源文件,不链接生成可执行文件
/EHsc启用 C++ 异常处理支持
/Fo+路径指定中间文件路径/Fo${workspaceFolder}\build\${fileBasenameNoExtension}.obj
/Fe+路径指定目标文件路径/Fe${workspaceFolder}\build\${fileBasenameNoExtension}.exe
/I 添加包含文件目录
/D+name[=value]定义预处理宏
/W设置警告级别
/O设置优化级别
/Zi生成调试信息
/MD使用动态链接运行时库
/MT使用多线程静态链接运行时库
/link 传递链接器选项
/P生成预处理输出
/showIncludes显示包含的文件
/?显示帮助信息

四、配置文件

可参考文章 链接
在VS Code 中运行 C/C++ 代码,可以使用配置文件来指定:头文件路径、库文件路径、编译器路径等。配置文件既可以自动生成、也可以手动配置,但大多是时候自动生成的配置文件往往无法满足我们的要求,因此我们更多时候是需要手动配置的。主要包括三个配置文件:setting.jsonc_cpp_properties.jsontasks.jsonlaunch.json ,三个配置文件的作用如下:

  • setting.json:应用及插件设置,可对插件进行设置,例如cmake等
  • c_cpp_properties.json:配置C/C++扩展的编译器路径和头文件搜索路径
  • tasks.json:配置执行任务,即在编辑器中执行的自定义命令或脚本
  • launch.json:配置调试器的启动和调试设置

1. setting.json

在 Visual Studio Code (VSCode) 中,settings.json 文件用于配置编辑器的各种设置和首选项。这些设置可以影响编辑器的外观、行为以及扩展的工作方式。settings.json 文件可以在全局、工作区和文件夹级别进行配置。

  • 用户设置:在全局范围内应用的设置,影响所有工作区。可以通过命令面板 (Ctrl+Shift+PCmd+Shift+P) 选择 Preferences: Open User Settings (JSON) 来打开用户设置的 settings.json 文件。

  • 工作区设置:在当前工作区范围内应用的设置,只影响当前工作区。可以通过命令面板选择 Preferences: Open Workspace Settings (JSON) 来打开工作区设置的 settings.json 文件。

  • 文件夹设置:在特定文件夹范围内应用的设置,只影响当前文件夹。可以通过在 .vscode 文件夹中创建 settings.json 文件来进行配置。

以下是一个简单的 settings.json 文件示例:

{
    "editor.fontSize": 14,
    "editor.tabSize": 4,
    "editor.wordWrap": "on",
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 1000,
    "terminal.integrated.fontFamily": "Courier New",
    "terminal.integrated.fontSize": 12,
    "eslint.enable": true
    "C_Cpp.intelliSenseEngineFallback": "enabled", 
    "C_Cpp.intelliSenseEngine": "Tag Parser",	
    "cmake.configureOnOpen": false,			
}

各字段含义如下:

  • editor.fontSize:设置编辑器字体的大小。
  • editor.tabSize:设置制表符的大小(一个 tab 等于多少个空格)。
  • editor.wordWrap:设置是否自动换行,选项包括 "off"(不换行)、"on"(自动换行)等。
  • files.autoSave:设置自动保存文件的方式,选项包括 "off"(不自动保存)、"afterDelay"(延迟自动保存)等。
  • files.autoSaveDelay:设置自动保存文件的延迟时间(毫秒)。
  • terminal.integrated.fontFamily:设置集成终端的字体。
  • erminal.integrated.fontSize:设置集成终端的字体大小。
  • eslint.enable:设置是否启用 ESLint 扩展。
  • C_Cpp.intelliSenseEngineFallback:当主 IntelliSense 引擎无法正常工作时,是否启用回退机制
  • C_Cpp.intelliSenseEngine:引擎设置,Tag Parser 引擎速度较快,但只提供基本的符号索引和代码导航功能
  • cmake.configureOnOpen: 是否在打开时配置cmake项目

2. tasks.json

在 Visual Studio Code(VSCode)中,tasks.json 文件用于定义任务。这些任务可以是任何类型的自动化任务,例如编译代码、运行测试、启动开发服务器等。通过配置 tasks.json 文件,你可以在 VSCode 内部创建、管理和执行这些任务,而无需切换到终端或其他工具。
简单示例如下:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "gcc -o myProgram main.c",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": ["$gcc"]
        },
        {
            "label": "test",
            "type": "shell",
            "command": "python -m unittest discover -s tests",
            "group": "test",
            "problemMatcher": []
        }
    ]
}

各字段含义如下:

  • version: 定义 tasks.json 文件的版本号。当前使用的版本通常是 "2.0.0"
  • tasks: 一个数组,每个任务都是一个对象,包含以下字段:
    • label: 任务的名称,用户可以通过这个标签来执行任务。
    • type: 任务的类型,常见的类型有 shellprocess。shell 类型的任务在命令行中执行,而 process 类型的任务则是在新进程中执行。
    • command: 要执行的命令,可以是任何有效的命令行命令。
    • args: (可选) 一个数组,包含传递给命令的参数。
    • group: (可选) 任务的分组信息。常见的分组有 buildtest,可以通过 isDefault 字段设置默认任务。
    • problemMatcher: (可选) 定义如何从任务的输出中识别并解析错误和警告信息。VSCode 内置了多种 problemMatcher,例如 $gcc$tsc 等。

Windows环境删除中间文件

{
 "label": "删除中间文件",
 "type": "shell",
 "command": "cmd.exe",
 "args": [
     "/c",
     "del",
     "${workspaceFolder}\\build\\*.obj",  	// 删除build文件夹下的所有.obj文件
     "${workspaceFolder}\\build\\*.ilk",	// 删除build文件夹下的所有.ilk文件
     "${workspaceFolder}\\*.pdb",      		// 删除工作空间下的所有.pdb 文件
 ],
 "group": "build",
},

Linux环境使用cmake配置项目

{
	"label": "build",
	"type": "shell",
	"command": "cd build && cmake .. && make",
	"group": {
    	"kind": "build",
    	"isDefault": true
	},
	"problemMatcher": ["$gcc"]
},

3. launch.json

在 Visual Studio Code (VSCode) 中,launch.json 文件用于配置调试器。它定义了如何启动和调试你的应用程序,包括要使用的调试器类型、要运行的程序、程序参数、环境变量、工作目录等。通过配置 launch.json 文件,你可以为不同的编程语言和运行时环境创建和管理调试配置。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/bin/your_program",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build",
            "miDebuggerPath": "/usr/bin/gdb",
            "logging": {
                "moduleLoad": false,
                "trace": false,
                "engineLogging": false,
                "programOutput": true,
                "exceptions": true
            },
            "launchCompleteCommand": "exec-run",
            "internalConsoleOptions": "openOnSessionStart"
        },
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}

各字段含义如下:

  • version:配置文件的版本号。当前版本通常为 “0.2.0”。
  • configurations:一个数组,每个配置对象对应一个调试配置。
  • 通用字段
    • name:配置的名称,用于在调试配置选择器中识别不同的配置。
    • type:调试器类型,例如 cppdbg(C/C++ 调试器)、python(Python 调试器)、node(Node.js 调试器)等。
    • request:调试请求类型,可以是 launch(启动调试会话)或 attach(附加到正在运行的进程)。
    • program:要调试的程序的路径。
    • args:传递给程序的命令行参数数组。
    • cwd:工作目录,调试器将在该目录下运行程序。
    • environment:环境变量数组,每个变量是一个对象,包含 name 和 value 字段。
    • externalConsole:是否使用外部终端窗口。true 表示使用外部终端,false 表示使用 VSCode 内置终端。
  • C/C++ 特定字段
    • MIMode:指定使用的调试器模式,例如 gdb 或 lldb。
    • setupCommands:调试会话开始时要执行的命令数组。
    • preLaunchTask:在启动调试会话之前要运行的任务名称。通常用于构建项目。
    • miDebuggerPath:调试器的路径。
    • logging:日志记录选项,控制哪些信息会记录到日志中。
  • Python 特定字段
    • program:要调试的 Python 脚本路径,通常使用 ${file} 表示当前打开的文件。
    • console:指定调试输出的终端类型,可以是 integratedTerminal(集成终端)或 externalTerminal(外部终端)

4. c_cpp_properties.json

在 Visual Studio Code (VSCode) 中,c_cpp_properties.json 文件用于配置 C/C++ 扩展的 IntelliSense 功能。IntelliSense 是一种代码智能感知技术,提供代码补全、语法检查、错误检测等功能。通过配置 c_cpp_properties.json 文件,你可以指定包括编译器路径、包含路径、预处理器定义等在内的各种设置,以便 C/C++ 扩展更好地理解和处理你的项目。

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE"
            ],
            "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "msvc-x64"
        },
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include",
                "/usr/local/include"
            ],
            "defines": [
                "LINUX"
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

各字段含义如下:

  • configurations:一个数组,每个配置对象对应一个平台或编译环境。
    • name:配置的名称,用于标识不同的平台或编译环境。
    • includePath:一个数组,指定 IntelliSense 需要搜索的包含路径。支持使用 ${workspaceFolder} 变量来表示工作区根目录,以及通配符 ** 表示递归搜索。
    • defines:一个数组,指定预处理器宏定义。
    • compilerPath:指定编译器的路径,用于提供编译器特定的 IntelliSense 支持。
    • cStandard:指定 C 标准,例如 c11、c99 等。
    • cppStandard:指定 C++ 标准,例如 c++11、c++17 等。
    • intelliSenseMode:指定 IntelliSense 模式,根据使用的编译器选择合适的模式,例如 msvc-x64、gcc-x64、clang-x64 等。

五、常用配置

1. 基础配置

c_cpp_properties.json

{
    "configurations": [
        // 32{
            "name": "Win32", // 当前配置的名称
            "includePath": [
                "${default}" 				//添加默认的头文件路径
                "${workspaceFolder}/**",
                "D:\\C\\VS2022\\Community\\VC\\Tools\\MSVC\\14.35.32215\\include" // 编译器的头文件路径
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            // 此处是你的 Windows SDK 版本号
            "windowsSdkVersion": "10.0.20348.0",
            // 此处是编译器的地址
            "compilerPath": "D:\\C\\VS2022\\Community\\VC\\Tools\\MSVC\\14.35.32215\\bin\\Hostx64\\x86\\cl.exe",
            "cStandard": "c17", // C 标准 
            "cppStandard": "c++17", // C++ 标准
            "intelliSenseMode": "windows-msvc-x86" // 智能感知的模式
        },
        // x64位
        {
            "name": "x64",
            "includePath": [
                "${workspaceFolder}/**",
                "D:\\C\\VS2022\\Community\\VC\\Tools\\MSVC\\14.35.32215\\include" // 编译器的头文件路径
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            // 此处是你的 Windows SDK 版本号
            "windowsSdkVersion": "10.0.20348.0",
            // 此处是编译器的地址
            "compilerPath": "D:\\C\\VS2022\\Community\\VC\\Tools\\MSVC\\14.35.32215\\bin\\Hostx64\\x64\\cl.exe",
            "cStandard": "c17", // C 标准 
            "cppStandard": "c++17", // C++ 标准
            "intelliSenseMode": "windows-msvc-x64" // 智能感知的模式
        }
    ],
    "version": 4
}

tasks.json

{
    "tasks": [
        {
            "label": "MSVC编译",
            "type": "shell",
            "command": "cmd.exe",
            "args": [
                "/c",
                // 编译器地址
                "D:\\C\\VS2022\\Community\\VC\\Auxiliary\\Build\\vcvars32.bat && cl.exe",
                "main.cpp",
                "/Zi",
                "/Od",
                "/EHsc",
                // 中间文件生成目录
                "/Fo${workspaceFolder}\\build\\${fileBasenameNoExtension}.obj", 
                // 目标文件生成目录
                "/Fe${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe", 
            ],
            "options": {
                "cwd": "${workspaceFolder}" // 作为当前打开目录
            },
            "problemMatcher": [
                "$msCompile"
            ],
            "group": "build",
            "detail": "Task generated by Debugger."
        },
    ],
    "version": "2.0.0"
}

launch.json

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

2. 进阶配置

下面的 tasks.json 配置文件将依次执行:编译源文件、删除中间文件、执行可执行文件操作。

{
    "tasks": [
        // MSVC编译
        {
            "label": "MSVC编译",
            "type": "shell",
            "command": "cmd.exe",
            "args": [
                "/c",
                "D:\\C\\VS2022\\Community\\VC\\Auxiliary\\Build\\vcvars32.bat && cl.exe",
                "main.cpp",
                "/Zi",
                "/Od",
                "/EHsc",
                // 中间文件生成目录
                "/Fo${workspaceFolder}\\build\\${fileBasenameNoExtension}.obj", 
                 // 目标文件生成目录
                "/Fe${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe",
            ],
            "options": {
                "cwd": "${workspaceFolder}" // 作为当前打开目录
            },
            "problemMatcher": [
                "$msCompile"
            ],
            "group": "build",
            "detail": "Task generated by Debugger."
        },
        // 删除中间文件
        {
            "label": "删除中间文件",
            "type": "shell",
            "command": "cmd.exe",
            "args": [
                "/c",
                "del",
                "${workspaceFolder}\\build\\*.obj",
                "${workspaceFolder}\\build\\*.ilk",
                "${workspaceFolder}\\*.pdb",
            ],
            "group": "build",
            "dependsOn": [
                "MSVC编译",
            ]
        },
        // RUN
        {
            "label": "RUN",
            "type": "shell",
            "command": "cmd.exe",
            "args": [
                "/c echo. && echo. && echo. && echo. && echo. && echo ================================================================================ && .\\build\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            }, // 作为当前打开目录
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "dependsOn": [
                "删除中间文件",
            ]
        },
    ],
    "version": "2.0.0"
}

3. 智能提示配置

方法一 使用c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include",
                "/usr/local/include"
            ],
            "defines": [
                "EXAMPLE_DEFINE"
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

方法二 使用compile_commands.json
compile_commands.json文件包含了项目中每个源文件的编译命令,可以让VS Code更好地理解项目的编译环境。你可以使用CMake生成这个文件并在VS Code中配置路径。生成compile_commands.json命令如下:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON /path/to/your/project

或者配置如下也可开启:

"cmake.configureSettings": {
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
    }

配置VS Code使用compile_commands.json可在setting.json中添加如下内容:

{
    "C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json"
    "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
}

或者在c_cpp_properties.json中添加以下内容

{
    "configurations": [
        {
            "name": "Linux",
            "compileCommands": "${workspaceFolder}/build/compile_commands.json"
        }
    ],
    "version": 4
}

即使开启使用compile_commands.json来设置智能提示,如果未找到compile_commands.json文件仍然会使用默认的"includePath"配置路径来进行智能提示。

方法三 使用Cmake Tools扩展
方法四 使用Makefile Tools扩展

六、问题解决

1. 执行代码控制台闪退问题的解决

方法一
修改 launch.json 文件中的 externalConsole 参数值为 false

"externalConsole":false

方法二
在主程序最后添加: system("pause");
方法三
在主程序最后添加: getchar();

2. 乱码解决

方法一
增添头文件<windows.h>并调用API函数SetConsoleOutputCP(65001)
在这里插入图片描述
方法二
更改VScode的编码格式为GBK,或者也可以将源代码文件用记事本打开并另存为ANSI编码格式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
方法三
修改VScode的setting.json配置文件,统一为一种编码格式即可。
在这里插入图片描述
方法四
Windows (中文) 默认的字符集是 Windows-936 (GBK),而 GCC 编译器默认编译的时候是按照 UTF-8 解析的,当未指定字符集时一律当作 UTF-8 进行处理,于是造成乱码。因此在GCC编译时添加以下参数即可解决。

-fexec-charset=gbk
-finput-charset=gbk

3. TAB键无法缩进

Ctrl+M会切换tab键行为(缩进或移动焦点)

4. C++调试无法显示容器的值

编辑 launch.json ,将 setupCommands 的值修改如下:

  "setupCommands": [
                    {
                        "description": "Register C++ Standard Library Printers for GDB",
                        "text": "python import sys;sys.path.insert(0, '/usr/share/gcc/python');from libstdcxx.v6.printers import register_libstdcxx_printers;register_libstdcxx_printers(None)",
                        "ignoreFailures": false
                    },
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    },
                    {
                        "description": "将反汇编风格设置为 Intel",
                        "text": "-gdb-set disassembly-flavor intel",
                        "ignoreFailures": true
                    }

https://github.com/Microsoft/vscode-cpptools/issues/1414

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值