一、软件下载
需要下载的软件如下:
- VS Code
- 编译工具:MinGW 或 MSYS2 或 VS2022
VS Code 下载地址:链接
MinGW 下载地址:链接 或者 链接
MSYS2 下载地址:链接
VS2022 下载地址:链接
上述软件下载完成以后安装步骤安装即可,编译工具建议选择MinGW。如果安装MinGW可以使用GCC编译器,而安装VS2022则可以使用MSVC编译器。
二、环境配置
1. 添加环境变量
将 MinGW
的 bin
文件夹添加到系统的 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.json
、c_cpp_properties.json
、tasks.json
、launch.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+P
或Cmd+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
: 任务的类型,常见的类型有shell
和process
。shell 类型的任务在命令行中执行,而process
类型的任务则是在新进程中执行。command
: 要执行的命令,可以是任何有效的命令行命令。args
: (可选) 一个数组,包含传递给命令的参数。group
: (可选) 任务的分组信息。常见的分组有build
和test
,可以通过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
}