用win下的VSCode远程连接linux服务器后,就可以用VSCode运行linux下代码了。
在编译运行代码前,按照VSCode的要求,我们要给编译和执行操作分别配置一堆参数。这就是launch.json和tasks.json配置的内容。
本文仅以linux举例,win下类似,无非是命令、路径名、环境变量有些区别。
launch.json可以说是必配的配置了。该文件用来执行具体的可执行文件。
参考配置如下
{
//Use Intellisense to learn about possible attributes.
//Hover to view descriptions of existing attributes.
//For more information,visit: https://go.microsoft.com/fwlink/?linkid=830387
"version":"0.2.0",
"configurations":[
{
"name":"myexe : makefile build and debug", //name随便取,用来在定义了多个configuration的时候区分执行的是哪一套参数。
"type":"cppdbg", //这个一般就不要改了,这个我还不了解其他的参数配置
"request":"launch", //这个一般就不要改了,这个我还不了解其他的参数配置
"program":"${workspaceRoot}/myexe", //执行这个文件,相当于命令行中输入这行
"args":["param1","param2","2>&1",">","out"], //program的参数,相当于命令行中在program后输入用空格隔开的这些参数。我这里前两个是执行文件自带的参数设置,后三个是将标准输出和标准错误输入到文件out中。
"stopAtEntry":false, //大概是表示是否在main函数处停下,类似在main上打断点。
"cwd":"${workspaceRoot}", //表示在哪个目录下执行program,相当于命令行中输入cd 该行
"environment":[] //不知道干嘛的
//"externalConsole":true, //如果使用控制台则需要打开这个。我这边加了这句后会有不知道在使用哪个控制台的问题,反正会很奇怪,就注释掉了。
"MIMode":"gdb", //使用哪个工具作为调试工具,只有两个选择gdb或lldb。lldb我不了解,和我一样不了解的人就写gdb吧。
"miDebuggerPath":"/usr/bin/gdb", //调试工具的路径
"setupCommands":[ //gdb相关的一些设置命令,相当于在执行gdb后,对gdb下命令行的设置。gdb相关的初始化配置,要在~/.gdbinit文件中配置,或者在这配置,我另开一篇文章写,涉及下面enable-pretty-printing的,不一定开了就有用了,还涉及其他的问题,这里先放个TODO。
{
"description":"Enable pretty-printing for gdb", //给人看的描述
"text":"-enable-pretty-printing", //gdb下执行的命令,启用整齐打印,就是让gdb打印的东西好看一点。
"ignoreFailures":true //并不清楚这个实际用来干嘛
},
{
"description":"Let User defined signal 1 not appear",
"text":"handle SIGUSR1 nostop noprint", //这个命令是我自己加的,因为我的程序会莫名奇妙出现调试时在非断点出停下的问题,用这个可以规避/忽视这个问题。
"ignoreFailures":true //并不清楚这个实际用来干嘛
}
],
//"internalConsoleoptions":"openOnSessionstart", //不知道干嘛的
"preLaunchTask":"build" //执行program前需要执行的task,这里需要和task.json中要执行的task的label一致
//"preLaunchTask":"" //如果没有tasks.json,或者不需要执行前置task,则可以这样写,或不写这行。这种情况一般是你已经有了带调试信息的可执行文件,不要在再通过编译等操作得到了。
}
]
}
tasks.json一般用来进行编译,一般来说只要按照VSCode给自动生成的代码写就可以了(没有自动生成的右下角一般有按钮可以点击选择生成哪种类型的编译方式)。下面的配置中前面注释部分是我环境上的一个自动生成的配置,但是由于我的项目通过其他方式生成了makefile,因此就直接通过makefile编译了。
下面的配置,由于launch.json的前置任务是build,所以会先调用build,再调用build的前置任务backup,再调用backup的前置任务make,最终的执行顺序就是make、backup、build。这种递归调用的方式和makefile的执行方式类似。
{
"tasks": [
// {
// "type": "cppbuild",
// "label": "C/C++: g++ build active file",
// "command": "/usr/bin/g++",
// "args": [
// "-fdiagnostics-color=always",
// "-g",
// "[file]",
// "-O",
// "${fileDirname}/${fileBasenameNoExtension}"
// ],
// "options": {
// "cwd": "${fileDirname}"
// },
// "problemMatcher": [
// "$gcc"
// ],
// "group": {
// "kind": "build",
// "isDefault": true
// },
// "detail": "Task generated by Debugger."
// }
// 下面每一个{}内都是一个task
{
"type": "shell", //使用shell作为command的输入地方,其他值我也不清楚。
"label": "make", //标记task名字,launch.json和task.json中依赖的名字都是这个label。
"command": "make", //在shell中输入的命令,这里make调用makefile中命令进行编译
"args": [ //command的参数
"-j" //这里-j是让make按照多个线程并行编译。
],
"options": {
"cwd": "${config:mypath}" //该命令执行的绝对路径(必须是绝对路径),对于make命令来说,makefile应该事先在该路径下。${config:mypath}不是VSCode内置的变量名,在settings.json中定义。
}
},
{
"type": "shell",
"label": "backup",
"command": "cp", // linux的复制命令
"args": [ // command的参数,将myexe复制到myexe_bak进行备份
"myexe",
"myexe_bak"
],
"options": {
"cwd": "${config:mypath}"
},
"dependsOn": ["make"] // 此task依赖于label为make的task,需要先执行label为make的task后,才能执行此task。make任务产生了一个可执行文件myexe。
},
{
"type": "shell",
"label": "build",
"command":"cp",
"args": [
"myexe",
"${workspaceRoot}/bin"
],
"options":{
"cwd": "${config:mypath}"
},
"dependsOn": ["backup"] // 此task依赖于label为backup的task,需要先执行label为backup的task后,才能执行此task。
}
],
"version": "2.0.0" // 这个大概是tasks.json的版本,VSCode应该会依据这个版本来判断该json文件其余key:value的写法和正确性。
}
在tasks.json的配置中我们提到了settings.json,这个文件能设置哪些东西我没有了解太多。我这里只写我知道的。
{
"files.associations": { //这个配置可以指定某些include的库按照哪种语言去解析该文件。特别是一些没有后缀名或后缀名不正常的文件,比如"*.extension":"html"就是用html去解析所有后缀为.extension的文件。
"atomic": "cpp",
"ostream": "cpp"
},
"mypath":"/home/username/xxx/yyy" //通过这种设置就可以在其他本文讲到的json文件中通过${config:mypath}来获得mypath的值了。
}
这个json是C或C++语言按需配置的文件。可以告诉VSCode查找include文件的路径,C文件和CPP文件的解析标准等。
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**" // **表示递归搜索该文件夹下所有文件
],
"defines": [],
"compilerPath": "/usr/bin/gcc", // 告诉系统编译器地址
"cStandard": "c89", // 告诉系统对C文件使用的C标准
"cppStandard": "c++98", // 告诉系统对CPP文件使用的C++标准
"intelliSenseMode": "linux-gcc-x64" // 不是太清楚,大概是告诉系统智能识别的模式。
}
],
"version": 4
}
这部分内容参考下方链接:
Visual Studio Code Variables Reference (VSCode官网解释)
vs code中的类似${workspaceFolder}的变量的解释_Hello_Ray的博客-CSDN博客
在VSCode打开路径/home/username/Documents/redis的redis项目
调用变量方式 | 释义 | 实际路径 |
${workspaceRoot} | 官网已经没有该变量了,已经是过去时了。虽然实际也能用,但建议使用${workspaceFolder}。虽然我上面也用了,但是我实际工程中会改掉。 | |
${workspaceFolder} | 工作区路径(我估计本质应该是.vscode的上级目录) | /home/username/Documents/redis |
${workspaceFolderBasename} | 工作区路径的最下级文件夹名 | redis |
${file} | 当前打开的文件的绝对路径 | (假设当前打开的是tasks.json) /home/username/Documents/redis/.vscode/tasks.json |
${relativeFile} | 当前打开文件相对于workspaceFolder的相对路径 | (假设当前打开的是tasks.json) .vscode/tasks.json |
${fileDirname} | 当前打开文件的上级文件夹的绝对路径 | (假设当前打开的是tasks.json) /home/username/Documents/redis/.vscode |
${relativeFileDirname} | 当前打开文件的上级文件夹相对于workspaceFolder的相对路径 | (假设当前打开的是tasks.json) .vscode |
${fileWorkspaceFolder} | 当前打开文件的工作空间文件夹。(有可能打开的文件不在当前工作空间,所以与workspaceFolder是有区别的) | (假设当前打开的是tasks.json) /home/username/Documents/redis |
${fileBasename} | 当前打开文件的文件名 | (假设当前打开的是tasks.json) tasks.json |
${fileBasenameNoExtension} | 当前打开的文件的没有扩展名的文件名 | (假设当前打开的是tasks.json) tasks |
${fileExtname} | 当前打开文件的扩展名 | (假设当前打开的是tasks.json) json |
${cwd} | 任务运行器启动时的当前工作目录 | |
${lineNumber} | 活动文件中当前选定的行号 | |
${selectedText} | 活动文件中当前选定的文本 | |
${execPath} | 运行VSCode可执行文件的路径 | |
${defaultBuildTask} | 默认构建任务的名称 | |
${pathSeparator} | 作系统用来分隔文件路径中的组件的字符 | / on macOS or linux,\ on Windows |
如何知道一个变量在运行中的实际值?
创建一个VSCode任务,将变量值输出到控制台。 例如,要查看${workspaceFolder}的解析值,你可以在tasks.json中创建并运行(Terminal > run Task)以下简单的echo任务:
{
"tasks": [
{
"label": "shell",
"type": "shell",
"command":"echo '<test>' ${workspaceFolder}"
}
],
"version": "2.0.0"
}
以上这些文件和用法,我不是很清楚是VSCode还是C/C++插件中的C/C++ intelliSence提供的配置。不过反正用VSCode写C/C++的应该都会装C/C++这个插件。
C/C++插件包括了C/C++ intelliSence, C/C++ debugging等插件功能,无需多安装这些包含的插件。
(PS:多说一句,VSCode现在已经自带了彩色括号配对功能了哦)