撰写本教程主要具有以下几个动机:
目前,网上能找到的教程通篇都是教如何配置 tasks.json
、launch.json
及安装扩展之类的,它可以很好的让你开始 Hello World!
,但是,离实战还有些欠缺,例如:多文件架构
在学习本教程之前,请确保你已满足以下要求:
提醒: 文中标记的超链接均是指向与内容相关的链接,如果想要深入了解可以点击链接获取更详细的信息
编译与调试 C/C++
时需要借助 GNU 的一些软件,例如:gcc、g++、gdb
如果你的系统上已经安装了 Visual Studio 可以阅读下文末的 引申内容,在 Windows 操作系统下想使用 GNU 的软件,通常有以下两个途径:
两者主要的区别是 Cygwin 提供了 POSIX 运行时环境。本文,主要以 MinGW 为例,如果对 Cygwin 感兴趣的同学,可以深入了解下。
首先,在 MinGW 下载页面,下载 mingw-get-setup.exe,这是 MinGW 提供的图形界面安装程序。
在安装 mingw-get-setup.exe 时,不要把程序安装在带空格的路径中,安装完成后,打开程序会看到以下界面:
在图形界面软件包列表框内勾选需要安装的包,然后在菜单栏点击 “Installation” 并选中 “Apply Changes”
【推荐】使用命令行界面安装程序
# 安装 gcc
mingw-get install gcc
# 卸载 gcc
mingw-get remove gcc
# 获取已安装的软件
mingw-get list
# 获取命令帮助
mingw-get help
你也可以通过,MinGW 快速开始 文档获取一些提示。现在,我们使用命令行来安装编译和调试软件:
mingw-get install gcc g++ gdb
mingw-get 命令不存在?
请添加环境变量,例如:C:\MinGW\bin
添加至系统的 PATH
环境变量内
已经自带一些 GNU 软件,所以可以跳过本步骤
在讲解配置之前,我们先回顾下之前的内容,之前的内容主要给我们透露了以下信息:
所以,配置类型可以分为 开发配置
与 编译配置
两类
开发配置,主要是围绕着 C/C++ 扩展去做,主要用于头文件提示之类的。
【建议】 将此配置存放在用户区,而不是工作区,这样可以一处配置到处可用。
用户区配置,也可以称为全局性配置,这样可以做到一处配置到处可用。配置打开步骤:扩展
=> C/C++
=> 设置图标
=> 点击用户区
=> 找到带 在 settings.json 中编辑
的选项,并点击 在 settings.json 中编辑
{
...
"C_Cpp.default.cStandard": "c11", // C 语言标准
"C_Cpp.default.cppStandard": "c++11", // C++ 语言标准
"C_Cpp.default.includePath": [ // 【非递归型】将在给定目录里查找头文件
],
"C_Cpp.default.browse.path": [ // 【递归型】将在给定目录里查找头文件
]
}
大多数情况下,我只配置上面几个选项,对于头文件查找会使用 C_Cpp.default.browse.path
来配置,而不会使用 C_Cpp.default.includePath
在 .vscode
文件夹下新建一个 c_cpp_properties.json
文件
{
"configurations": [
{
"name": "win32", // 平台名称。参考:Nodejs process.platform
"browse": {
"path": [
"${default}" // 引用默认配置。继承自用户区的 C_Cpp.default.browse.path 选项
]
}
}
]
}
通过 Visual Studio Code 进行配置时可以将鼠标悬浮在键上获得提示信息,也可以参考 C/C++ 扩展设置 来获得更详细的内容。
编译配置,通常围绕着 GNU 软件去做,主要用于调试。Visual Studio Code 调试 C/C++ 相关的配置有两个:
Visual Studio Code 内置了两种调试模块,分别是 Launch & Attach,对于 C/C++
则选用 Launch (启动型) 配置。另外,你还可以参阅 Visual Studio Code 的内置变量 和 C++ Debug 获得更多提示信息。
Launch 模块的配置:
launch
键下.vscode
文件夹下,新建 launch.json
tips: 将配置放在用户区时,请将 tasks
也放置在用户区,否则将找不到任务
建议: 将此配置放在用户区配置中
注意: 下面演示代码,均在用户区配置文件中完成。如果要了解配置的具体选项,可以通过编辑器代码提示获得提示信息或者参考 Launch.json 和 C/C++ Launch.json
{
...
"launch": {
"version": "0.2.0",
"configurations": [
{
"name": "C++", //【必须】调试运行名称,自定义
"type": "cppdbg", //【必须】指定调试器类型。
"request": "launch", //【必须】请求类型
"program": "${workspaceFolder}/debug/${fileBasenameNoExtension}.exe", //【必须】。要调试的文件。对应 tasks.json 中的输出结果
"cwd": "${workspaceFolder}", //【可选】目标的工作目录
"MIMode": "gdb", //【可选】指示 VS Code 链接到的调试器
"miDebuggerPath": "gdb", //【必须】如果没有配置 PATH 变量,请写绝对路径
"externalConsole": true, //【可选】是否使用外部终端调试程序
"preLaunchTask": "Build C/C++ Project", //【必须】调试会话前启动的任务,用来编译代码。对应 tasks.json 中的 label
"setupCommands": [ //【可选】传递给 gdb 的命令
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
}
Tasks 模块的配置:
tasks
键下.vscode
文件夹下,新建 tasks.json
tips: 工作区配置不会覆盖用户区配置
单文件结构的项目,适用于标准库的代码编写,如果想要引用第三方库就不合适了,因为涉及到链接等问题。另外,你还可以参阅 Visual Studio Code 的内置变量 和 GCC 命令选项 获得更多提示信息。
tips: g++
属于 gcc
,是专门用来编译 c++
代码的编译器
{
...,
"tasks": {
"version": "2.0.0",
"tasks": [
{
"label": "Build C/C++ Project", //【必须】任务名称。对应 launch.json 中的 preLaunchTask
"type": "shell",
"command": "g++",
"args": [// g++ 命令选项
"-g", //【必须】在可执行程序中包含标准调试信息
"-o",
"${workspaceFolder}/debug/${fileBasenameNoExtension}.exe", //【必须】输出文件。对应 launch.json 中的 program
"${file}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"windows": {
"options": {
"shell": {
"executable": "PowerShell.exe"
}
}
},
"group": "build"
}
]
}
}
多文件结构是面向业务的最佳实战,它将代码拆分成多个文件,相比于单文件夹结构,可读性和可维护性更高。
首先安装 C/C++ Build Task 扩展,这个扩展由我本人编写,主要用于多文件结构编译。你还可以下载 示例代码 进行深入学习。
注意: 扩展需要 Visual Studio Code 版本 >= 1.49.0
{
...,
"tasks": {
"version": "2.0.0",
"tasks": [
{
"label": "Build C/C++ Project", // 【必须】任务名称。对应 launch.json 中的 preLaunchTask
"type": "cpp", // 【必须】任务类型为 cpp 由扩展提供
"sources": [ // 【必须】源文件。支持 glob 语法
"${fileDirname}/**/*.cc"
],
"output": "${workspaceFolder}/debug/${fileBasenameNoExtension}.exe", // 【必须】输出文件。对应 launch.json 中的 program
"options": { //【可选】其他选项配置
"cwd": "${fileDirname}" // 编译器工作目录
},
"includePath": [ //【可选】将在给定目录里查找头文件。支持 glob 语法
"${workspaceFolder}/vendor/**/include"
],
"libraryPath": [ //【可选】将在给定目录里查找库文件。支持 glob 语法
"${workspaceFolder}/vendor/**/lib/*"
],
"compilerPath": "g++", //【可选】编译器路径
"compilerArgs": [ //【可选】编译器命令选项
"-g"
],
"problemMatcher": [
"$gcc"
],
"group": "build"
}
]
}
}
借助 Visual Studio 携带的 cl.exe
也可以进行编译 c/c++
,这只是作为本文的引申阅读,有兴趣的同学可以深入研究下。
.vscode/tasks.json
{
"version": "0.2.0",
"configurations": [
{
"name": "C++ x86",
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"preLaunchTask": "cl x86"
}
]
}
.vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "cl x86",
"type": "shell",
"command": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Tools\\MSVC\\14.26.28801\\bin\\Hostx64\\x86\\cl.exe",
"args": [
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
],
"options": {
"env": {
"INCLUDE": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Tools\\MSVC\\14.26.28801\\include;C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\shared;C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt;C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\um;C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\winrt;",
"LIB": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Tools\\MSVC\\14.26.28801\\lib\\x86;C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\ucrt\\x86;C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x86;"
},
"shell": {
"executable": "PowerShell.exe"
}
},
"group": "build"
}
]
}
打包一沓开源的 C/C++ 包管理工具送给你!