tasks用于在launch前執行任務,launch用于讀取執行檔案。
這兩者經常組合起來用于需要編譯語言的自動編譯+自動執行,下面以C++、Rust和Typescript為例。
程式
工作區包含main.cpp、頭檔案夾include以及檔案夾中的h檔案、src檔案夾以及檔案夾中的cpp檔案。
.vscode是後面生成的,不用管。
在swap.h檔案中對類進行了聲明,在swap對類進行了定義,然後在面函數中使用類。
swap.h檔案
#pragma once
#include<iostream>
using namespace std;
class Swap
{
public:
Swap(int a, int b){
this->_a = a;
this->_b = b;
}
void run();
void printInfo();
private:
int _a;
int _b;
};
swap.cpp
#include "swap.h"
void Swap::run(){
int temp;
temp = _a;
_a = _b;
_b = temp;
}
void Swap::printInfo()
{
cout << "_a = " << _a << endl;
cout << "_b = " << _b << endl;
}
main.cpp
#include <iostream>
#include "swap.h"
int main()
{
Swap myswap(10, 20);
myswap.printInfo();
myswap.run();
myswap.printInfo();
cout << "After swap" << endl;
return 0;
}
調試
run->g++
遇到的問題及解決方式
1.最開始是使用g++指令能夠成功執行程式,但是使用VSCode就報錯,即h檔案沒有包含;
解決方式:
在tasks.json檔案的args參數中加上圖中方框中的指令,注意前一句需要加上逗号!
"-I",
"${workspaceFolder}/include"
2.将頭檔案包含後報錯,對類的成員函數未引用;
重新執行顯示未引用,因為上面的tasks.json檔案隻編譯了main.cpp 沒有編譯swap.cpp
解決方式:
将swap.cpp加到-g指令後就行
"-g",
"${file}",
"${workspaceFolder}/src/swap.cpp",
如果有更多的cpp檔案,也能這樣解決。
拓展
預定義變量#
支援下面的預定義變量:
${workspaceFolder} - 目前工作目錄(根目錄)
${workspaceFolderBasename} - 目前檔案的父目錄
${file} - 目前打開的檔案名(完整路徑)
${relativeFile} - 目前根目錄到目前打開檔案的相對路徑(包括檔案名)
${relativeFileDirname} - 目前根目錄到目前打開檔案的相對路徑(不包括檔案名)
${fileBasename} - 目前打開的檔案名(包括擴充名)
${fileBasenameNoExtension} - 目前打開的檔案名(不包括擴充名)
${fileDirname} - 目前打開檔案的目錄
${fileExtname} - 目前打開檔案的擴充名
${cwd} - 啟動時task工作的目錄
${lineNumber} - 目前激活檔案所選行
${selectedText} - 目前激活檔案中所選擇的文本
${execPath} - vscode執行檔案所在的目錄
${defaultBuildTask} - 預設編譯任務(build task)的名字
預定義變量示例:
假設你滿足以下的條件
- 一個檔案
在你的編輯器中打開;/home/your-username/your-project/folder/file.ext
- 一個目錄
作為你的根目錄./home/your-username/your-project
下面的預定義變量則代表:
${workspaceFolder} - /home/your-username/your-project
${workspaceFolderBasename} - your-project
${file} - /home/your-username/your-project/folder/file.ext
${relativeFile} - folder/file.ext
${relativeFileDirname} - folder
${fileBasename} - file.ext
${fileBasenameNoExtension} - file
${fileDirname} - /home/your-username/your-project/folder
${fileExtname} - .ext
${lineNumber} - 光标所在行
${selectedText} - 編輯器中所選擇的文本
${execPath} - Code.exe的位置
Tip: vscode的智能提示會在 tasks.json和 launch.json 提示所有支援的預定義變量.
=================================================
目錄:
.vscode/task.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++-7 生成活動檔案",
"command": "/usr/bin/g++-7",
"args": [
"-fdiagnostics-color=always",
"-g",
"${workspaceFolder}/main.cpp",
"${workspaceFolder}/src/swap.cpp",
"-o",
"${workspaceFolder}/mainX",
"-I",
"${workspaceFolder}/include"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "調試器生成的任務。"
}
],
"version": "2.0.0"
}
{
// 使用 IntelliSense 了解相關屬性。
// 懸停以檢視現有屬性的描述。
// 欲了解更多資訊,請通路: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++-7 - 生成和調試活動檔案",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/mainX",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "為 gdb 啟用整齊列印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++-7 生成活動檔案",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}