目录
第一章 初次接触vscode
第二章 vscode快捷键的使用
第三章 vscode的界面配置
第四章 vscode作为Markdown编辑器
第五章 vscode进行git管理
第六章 vscode的迁移
第七章 vscode配置go语言开发环境
第八章 vscode配置c/c++开发环境
前言
平时工作用到的是c编程, 当都是在linux下编译, 在windows下编译的情况很少, 但是也是有的, 比如我们做的windows下的分析工具, 也是用c语言写的, 需要在windows下编译, 最早使用的是VC++ 6.0, 软件经典但很老久, 一些功能也不是很方便, 后来换了code block, 挺不错的, 这不最近习惯了vscode, 就想着看是否可以用vscode进行windows下的c开发, 在上网搜索一番后开始了自己的配置.
配置过程
- 因为是刚开始学习配置, 为了简便, 就自己新建一个简单点的c工程, 以免到时候有错误都不知道是代码本身的问题还是配置的问题.
- 简单工程能够编译的话说明配置上是可行的, 然后再进行复杂工程的编译.
- 还是以经典的'helloworld'开始, 首先自己创建一个helloworld目录, 然后新建一个helloworld.c文件, 敲入以下代码
#include <stdio.h>
int main()
{
printf("hello world.\n");
}
- 到这里一个helloworld的工程就建好了, 后面就看怎么编译了, 我们把helloworld.c编译成helloworld.exe来运行.
- 说一下要用到的工具. c/c++插件, 可以在插件管理中搜索安装; mingw64(注意安装路径不要有空格), 这是编译调试工具(至于mingw64, mingw, sygwin的选择和区别, 可以参考这里)., 注意mingw64装好之后要配置环境变量哈, 安装配置方法网上很多, 这里提供一处做参考(https://www.cnblogs.com/bpf-1024/p/11597000.html).
- 在开始编译之前, 我们先来了解一点东西, 那就是vscode编译时要用到的两个文件'launch.json'和'task.json', 在官方说明里, 还有一个'c_cpp_properties.json'文件, 这里说一下它们各自的作用.
tasks.json (build instructions)
这个文件定义了编译的方法, 比如用哪个编译器, 编译时候的参数是啥, 目标文件等.
launch.json (debugger settings)
这是调试的配置, 在vscode里F5可以进行调试, 这里面指明用哪个调试器进行调试, 调试的是哪个程序, 也就是运行哪个task(和上面的task对应)
c_cpp_properties.json (compiler path and IntelliSense settings)
看官方说明这是配置编译器路径的, 但是在task.json中command参数就可以指定路径啊, 是不是之前没有command这个参数, 现在有这个参数了就用不到c_cpp_properties.json这个文件了呢(参考这里推测的). 没有细究这个问题, 反正我目前是没有用到这个文件.
- 好了, 了解了各个文件的作用之后, 现在就要开始配置这些文件了. 我们先看看编译过程是否可以, 先不调试. 也就是只配置task.json, 先不管launch.json.
依次选择菜单"终端->配置默认生成任务", 然后选择"g++.exe build active file"生成一个默认的task.json文件, 可以发现它是在.vscode目录下的. 我们配置一下这个文件, 见如下注释:
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "mybuild", #给你的任务起一个名字
"command": "D:\\mingw64\\bin\\g++.exe", #这里指定你的编译器
# args是一些编译参数的配置
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "D:\\mingw64\\bin" #和上面编译器路径对应
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
了解一下官方的说明:
The command setting specifies the program to run; in this case that is g++. The args array specifies the command-line arguments that will be passed to g++. These arguments must be specified in the order expected by the compiler. This task tells g++ to take the active file ({fileDirname}) with the same name as the active file but with the .exe extension (${fileBasenameNoExtension}.exe), resulting in helloworld.exe for our example.
-
task.json配置好了, 我们就可以运行它了, 选择菜单"终端->运行任务", 根据配置, vscode会调用你指定的g++编译器, 然后根据你配置的编译参数对helloworld.c进行编译, 生成你指定的目标文件helloworld.exe.
输出信息如下:
你可以使用" .\helloworld.exe"来运行程序, 此时会打印"hello world"字符串.
- 如果要调试程序, 需要告诉vscode用哪个工具来调试, 这是就需要配置launch.json了, 按F5或者"调试->启动调试", 然后选择"C++ (GDB/LLDB)"生成默认的launch.json, 修改内容如下:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
# 指定调试的程序, 就是task生成的目标文件, 这里是helloworld.exe
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false, # 修改这里可以弹出调试窗口
"MIMode": "gdb",
# 指定你调试用的工具
"miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
看官方说明还有这个参数"preLaunchTask": "g++.exe build active file", 但我的vscode生产的文件并没有这个参数, 这个参数的作用是说, 在执行launch之前需要执行的任务, 比如前面我们配置的task是编译用的, 这里配置的launch是调试用的, 但通常我们调试时希望程序自动编译新修改的代码然后再开始调试, 这是就要用到"preLaunchTask"这个配置了, 把它配置成你前面task的名字, 那么在你每次调试前, 它都行先执行前面的task然后再开始调试.
注意事项
- 看官方说明, 安装mingw64的时候, 注意不要让路径中包含空格.
- 注意编译和调试的时候, 你的默认终端应该是powershell等windows终端, 像我开始用的wsl就会报错. 因为我们是在windows下工作的.
- 编译或者调试要回到helloworld.c再进行.
>>>>>>>>>>>>>>>>>>
补充:
这里补充一点关于code runner的说明. code runner是一款代码调试插件, 和上面的功能差不多, 它其实也是有一些配置的, 要告诉他如何去编译, 编译时带哪些参数.
这个是在code-runner.executorMap这一项配置的, 可以在设置中搜索, 然后在setting.json中修改, 在插件的说明文档中有举例, 比如c语言的编译方法为"c": "cd fileName -o dir$fileNameWithoutExt", 这其实和上面的编译很相似.
再就是对于中文, 默认的编译方式可能会显示乱码, 可以通过在gcc或g++后面添加-fexec-charset=GBK 参数来解决. 上面的方法也是.