0x00 缘由
- 因为某些原因,需要使用VScode来编译C++文件。在各种Google之后,终于找到了配置的方法。
0x01 需要的组件
- 首先,我们需要VScode本体,和Windows下的C/C++ Build Tools,如果机子上已经安装了Visual Studio的话,可以略过这一步。
- 若未安装Visual Studio的话,可以下载Visual C++ 2015 Build Tools
- VScode插件需要安装了cpptools,以及powershell(cmd会导致输出乱码)。
0x02 配置tasks.json
- 做好以上准备之后,我们打开VScode。这里用的是最新版VScode(1.10.2),在这次更新中,tasks更新到了2.0.0。更新事项
- 首先是用VScode打开一个文件夹,然后按下Ctrl+Shift+P打开命令窗口。输入tasks回车,就会自动创建一个tasks.json文件。
- 在这里,我贴出我配置好的tasks.json:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"taskName": "Build",
"command": "./build.bat",
"args": [
"${workspaceRoot}","${relativeFile}","${fileBasenameNoExtension}"
],
"isShellCommand": true,
"showOutput": "always"
}
]
}
- 第一行的version代表了使用的tasks版本,这里必须是2.0.0
- 接着的build.bat会在下面给出
- args
- ${workspaceRoot}代表项目的根目录,也就是文件夹根目录
- ${relativeFile}指当前打开的cpp文件和根目录的相对路径(包括文件本身)
- ${fileBasenameNoExtension}则是不包括扩展名的文件名。
0x03 编写build.bat
@echo off
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"
cd /d %1
set compilerflags=/Od /Zi /EHsc /Wall /std:c++14
set linkerflags=/Fe:.build/main.exe
cl.exe %compilerflags% %2 %linkerflags%
del %3.obj
- 首先,这里第二行的call指向Visual Studio的vcvars64.bat文件。每个人电脑的路径都不一样,需要依据实际情况进行更改。若是下载的Visual C++ build tools,那么有可能是这样
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
- 第三行的
cd /d %1
用于切换目录到项目的根目录。这里的%1是由前面tasks.json传入的值。 - 第四第五行是编译时的选项
- /Od:不做优化
- /Zi:启用调试信息
- /EHsc:启用 C++ EH (没有 SEH 异常),外部 “C” 默认为 nothrow
- /Wall:启用所有的警告
- /Fe:.build/main.exe: 保存exe文件到.build/main.exe
- 第六行的%2指tasks.json传入的第二个参数,也就是当前打开文件的相对路径。
- 第七行的del用于删除编译过程中产生的obj文件,%3指tasks.json传入的第三个参数,为不带扩展名的文件名。
0x04 编译
- 配置完上面两个文件之后,就可以按Ctrl+P打开面板,输入task **就可以看到我们在tasks.json中配置的任务项。选择Build**即可完成编译。
- 同时,我们可以绑定Build任务到快捷键
{
"key": "ctrl+shift+b",
"command": "workbench.action.tasks.runTask",
"args": "Build"
}
- 如此只要按Ctrl+Shift+B就可以快速编译当前打开的文件。
0x05 调试
- 打开调试窗口,点击左上的齿轮图标,可以看到有几个调试模板可供选择。这里我们选择C++(Windows),自动创建launch.json
- 在这个文件里最主要的是这几个属性
"program": "${workspaceRoot}/.build/main.exe",
"symbolSearchPath": "${workspaceRoot};${workspaceRoot}/.build",
"externalConsole": true
- program指明需要调试的可执行文件路径
- symbolSearchPath指明.pdb文件路径
- externalConsole表示是否打开独立命令行窗口,一般为true
0x06 总结
- 大致流程如上,关键是VScode出现的时间较短,同时版本更新快,功能变动较大,因此有些官方文档已经快要过时了。希望微软能够在更新VScode的时候,将配套的文档一起更新完备
0x07 参考链接
Building your C++ application with Visual Studio Code
Integrate with External Tools via Tasks
February 2017 (version 1.10)
Configuring launch.json for C/C++ debugging