文章目錄
- 1. tasks.json、launch.json配置文件中參數(屬性)的說明
- 2. tasks.json介紹
- 3. launch.json介紹
- 4. 直接生成tasks.json、launch.json配置文件的另外一種方式
- 5. c_cpp_properties.json介紹
- 6. 運行多個C/C++文件
- 7. 命令行方式編譯C++
1. tasks.json、launch.json配置文件中參數(屬性)的說明
??首先我們創建了一個code項目,然后在code文件夾下分別建立了day1和day2兩個目錄(文件夾),最后在day1和day2文件夾下分別創建hello.c
和main.cpp
兩個文件,code項目的組織結構如下圖1所示。在VScode中,默認情況下code文件夾是一個workspace(工作區、工作空間)。
??下面,我們基于上面code項目的組織結構對tasks.json、launch.json配置文件中的參數(屬性)進行說明。(以hello.c文件為例)
(1)${workspaceFolder}
:表示當前workspace(工作區、工作空間)文件夾的路徑,也即當前項目絕對路徑。例如:D:\code
,code就是一個工作區。
(2)${fileDirname}
:表示當前打開文件的絕對路徑,但不包括文件名。例如打開hello.c文件,該文件所在的絕對路徑(${fileDirname}
)為:D:\code\day1
,day1就是hello.c文件的目錄。
(3)${workspaceFolder}/**
:表示當前workspace(工作區、工作空間)文件夾的路徑,而且還會遞歸搜索所有子目錄。例如:當前項目的絕對路徑為D:\code
,不僅要搜索code文件夾,還會遞歸搜索code的所有子目錄(子文件夾)。
(4)${workspaceRootFolderName}
:表示workspace(工作區、工作空間)文件夾名字,也就是當前項目所在文件夾名字,例如code文件夾。
(5)${file}
:表示當前打開的文件,指的是當前活動文件。包括絕對路徑,文件名,文件后綴名。例如:D:\code\day1\hello.c
。
(6)${fileBasename}
:當前打開含有后綴的文件名,不包括路徑。
(7)${fileBasenameNoExtension}
:表示當前打開的文件名,但不包括路徑和后綴名。
(8)cwd
(current working directory):當前工作目錄,它是操作系統當前正在運行進程所在的目錄。在命令行界面(比如,cmd)中,用戶輸入命令時,默認情況下會在cwd下執行。
更多命令參考:變量參考
參考文章
最新VS code配置C/C++環境(tasks.json, launch.json,c_cpp_properties.json)及運行多個文件、配置Cmake
(上面這篇文章介紹的比較詳細,我下面總結的大部分內容都摘抄于該文章,非常感謝該博主)
2. tasks.json介紹
??tasks.json在編譯時用的到,配置tasks.json文件的步驟(下面以hello.c文件為例):
- 首先運行hello.c文件(點擊右上角的運行圖標),再點擊"C/C++:gcc.exe生成和調試活動文件",如圖2所示。
- 經過步驟1,在工作區code文件夾下可以生成一個
.vscode\tasks.json
文件,如下圖3所示。除了tasks.json配置文件外,launch.json、c_cpp_properties.json配置文件也放在.vscode
文件夾下。
- tasks.json文件配置內容如下。在配置路徑時只能使用
\\
或/
隔開目錄。
{"tasks": [{"type": "cppbuild","label": "C/C++: gcc.exe 生成活動文件","command": "d:\\AppInstall\\GCCAPP\\mingw64\\bin\\gcc.exe","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {"cwd": "d:\\AppInstall\\GCCAPP\\mingw64\\bin"// "cwd": "${fileDirname}":有時候"cwd"的值為:"${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "調試器生成的任務。"}],"version": "2.0.0"
}
下面對tasks.json文件中的參數進行介紹:
(1)“type”:任務類型,可以取cppbuild、shell、process,三種執行時稍有差異,這里選擇默認cppbuild。
(2)“label”:任務標簽(標記),也稱任務名稱,對應的值可以更改。tasks.json文件中label對應的值要和launch.json里面"preLaunchTask"對應的值一致。
(3)“command”:編譯器及其路徑。.c
用gcc.exe編譯器(C語言編譯器),.cpp
用g++.exe編譯器(C++語言編譯器),還可以是Cmake、make。
(4)“args”:方括號里面是傳給gcc命令或g++命令的一系列參數,用于實現某些功能。
(5)“-g”:生成和調試有關的信息,launch.json會用到這些信息。如果少了這個"-g",生成的可執行文件就不能被調試了。
(6)“${file}”:編譯當前打開的.c(或.cpp)文件,此處是hello.c文件。
(7) “-o”:指定編譯的輸出,windows系統下輸出.exe文件。
(8)"${fileDirname}\\${fileBasenameNoExtension}.exe"
:表示在當前工作目錄下生成一個與源代碼同名的可執行文件,即在day1目錄下生成一個hello.exe文件。如果將${fileDirname}
修改為${workspaceFolder}
,那么就會在當前工作區code文件夾下生成一個hello.exe文件。也可以在工作區code文件夾中建立一個bin文件夾,接著將編譯后輸出的可執行文件路徑設置為:"${fileDirname}\\bin\\${fileBasenameNoExtension}.exe"
。同時需要將launch.json文件中的參數"program"設置為:"${fileDirname}\\bin\\${fileBasenameNoExtension}.exe"
。那么就會在bin文件夾下生成一個可執行文件(.exe)。
3. launch.json介紹
? ?launch.json文件主要用于運行和調試的配置,具有程序啟動調試功能。launch.json文件會啟用tasks.json的任務,并能實現調試功能。
- 單擊左側欄運行和調試圖標,再點擊創建launch.json文件選項,會在右側出現選擇調試器菜單。接著單擊C++(GDB/LLDB),這里的GDB、LLDB是可以作為C/C++的調試器(debugger)。具體實現過程如下圖4所示。
- 執行完步驟1,會在工作區code中的.vscode文件夾里面生成一個launch.json配置文件。這里的launch.json文件是首次配置,默認為空,如下圖5所示。
- 在configurations的中括號里進行配置launch.json文件,配置的內容如下。
{"configurations": [{"name": "C/C++: gcc.exe 生成和調試活動文件","type": "cppdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "d:\\AppInstall\\GCCAPP\\mingw64\\bin",// 有時候 "cwd"為: "${fileDirname}"或"${workspaceFolder}""environment": [],"externalConsole": false,"MIMode": "gdb","miDebuggerPath": "d:\\AppInstall\\GCCAPP\\mingw64\\bin\\gdb.exe","setupCommands": [{"description": "為 gdb 啟用整齊打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "將反匯編風格設置為 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}],"preLaunchTask": "C/C++: gcc.exe 生成活動文件"}],"version": "2.0.0"
}
下面對launch.json文件中的參數進行介紹:
(1)“name”:自定義命名運行與調式的名稱,將在左側運行和調試的菜單中顯示名稱,如下圖6所示。
(2)“type”:配置類型,調試器類型,cppdbg為C/C++的調試類型。
(3)“request”:配置請求類型,可以為launch(啟動)或attach(附加)。
(4)“program”:在windows系統下需要進行調試的可執行文件(.exe文件)及其路徑,應該與tasks.json編譯后輸出的可執行文件(.exe文件)及其路徑一致。
(5)“args”:程序調試時傳遞給程序的命令行參數,一般設為空即可,這里提到的程序實際就上面的.exe文件。
(6)“stopAtEntry”:設為true時程序將暫停在程序入口處,一般設置為false。
(7)“cwd”:當前工作目錄(路徑)。
(8)“environment”:添加到程序的環境變量。
(9)“externalConsole”:true開啟外部控制臺窗口,false會使用vscode內部控制臺窗口。
(10)“MIMode”:指示 MIDebugEngine 要連接到的控制臺調試程序,允許的值為 “gdb”、“lldb”。這里使用gdb進行調試。
(10)“miDebuggerPath”:調試器debugger文件及其路徑,這里是調用gdb調試器的路徑。
(11)“preLaunchTask”:運行和調式前要啟動的tasks任務,也即要啟動的編譯任務,任務名要和tasks.json里面的"label"值對應一致。
4. 直接生成tasks.json、launch.json配置文件的另外一種方式
- 點擊右上方的添加調試配置按鈕,接著再點擊"C/C++:gcc.exe生成和調試活動文件",如下圖7所示。
- 經過步驟1可以在.vscode文件夾中生成tasks.json、launch.json這兩個配置文件,如下圖8所示。
5. c_cpp_properties.json介紹
?? c_cpp_properties.json文件主要是對編輯環境的配置,是針對IntelliSense(智能感知)引擎的有關配置。intelliSense是各種代碼編輯功能的通用術語,包括:代碼補全、參數信息提示、快速信息描述提示和成員列表提示等,因而,intelliSense也稱為代碼提示(code hinting)。
?? 當我們裝了C/C++編譯器,并在vs code中安裝了具有調試功能的C/C++擴展(Extension)后,會自動產生默認的c_cpp_properties.json配置。上面tasks.json、launch.json文件配置完后,我們就能運行C/C++程序了,此時采用默認的c_cpp_properties.json配置。一般情況下,我們可以不用配置c_cpp_properties.json,按上面步驟配置完tasks.json、launch.json后就可以運行代碼了。但如果我們要指定頭文件(.h文件)、庫的位置,那么就需要配置c_cpp_properties.json、tasks.json文件。
?? 我們可以通過快捷鍵Ctrl+Shift+P
打開命令面板,接著輸入關鍵詞C/C++編輯配置
,之后會彈出C/C++編輯配置(JSON)和C/C++編輯配置(UI)兩種選項,如下圖所示。
(1)C/C++編輯配置(JSON)是c_cpp_properties.json文件形式的設置,單擊該選項就會在.vscode文件夾下生成一個c_cpp_properties.json配置文件;
(2)C/C++編輯配置(UI)可以通過一個可視化界面來手動設置,當我們單擊 C/C++編輯配置(UI) 選項時,就會自動在.vscode文件夾下生成一個c_cpp_properties.json配置文件。我們可以C/C++配置 菜單下來制定編譯器路徑,如下圖所示。
(3)c_cpp_properties.json配置文件的默認配置如下:
{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"cStandard": "c17","cppStandard": "gnu++14","intelliSenseMode": "windows-gcc-x64","compilerPath": "D:/AppInstall/GCCAPP/mingw64/bin/gcc.exe"}],"version": 4
}
文件中的參數介紹如下:
- “name”:名稱。操作系統根據這個名稱識別對應的屬性配置,windows系統:Win32;Linux系統:Linux;macOS系統:Mac。
- “includePath”:頭文件路徑。以便IntelliSense(智能感知)引擎的搜索。
"${workspaceFolder}/**"
:當前項目所在根目錄并遞歸搜索子目錄,也就是當前工作區文件夾的路徑(例如:D:\code),而且還會遞歸查找其所有的子目錄。- “defines”:IntelliSense(智能感知)引擎在分析文件時要使用的預處理器定義列表。
- “cStandard”:用于IntelliSense(智能感知)引擎的c標準(版本)。
- “cppStandard”:用于IntelliSense(智能感知)引擎的c++標準(版本)。
- “intelliSenseMode”:IntelliSense(智能感知)的模式。
- “compilerPath”:根據該路徑查詢編譯器(gcc.exe、g++.exe),以便啟用更加準確的IntelliSense(智能感知)。這里并不是調用編譯器,真正啟用編譯器編譯的是在tasks.json文件里。
6. 運行多個C/C++文件
?? 按照上面步驟配置好tasks.json、launch.json文件后,我們就可以編譯運行C/C++程序,只不過此時只能編譯運行一個C/C++源文件。如果我們編寫的主程序需要調用其它文件的函數,也就是要編譯多個文件時,task.json文件中的"${file}"
是不能實現多文件編譯的,因為"${file}"
表示當前打開的C/C++源文件,也就是說只能編譯一個C/C++源文件。那這時候該咋辦啊,我好怕怕啊,救命啊。不要慌不要急,下面給出解決方案。
??我們以圖1 code項目的組織結構
為基礎,在工作區code文件夾的day1文件夾下創建hello.c、func.c、sum.h
這個文件,如下圖9所示。
其中hello.c文件為:
#include <stdio.h>
#include "sum.h"
int main()
{printf("hello C");int s = sum(1,2);printf("sum = %d", s);return 0;
}
func.c文件為:
int sum(int a, int b){return a+b;
}
sum.h文件為:
int sum(int a, int b);
??解決方案的中心思想是:你在編譯的時候用到幾個C/C++源文件,那么在tasks.json配置文件中就添加相應數量的C/C++源文件路徑。C/C++源文件路徑添加的位置在tasks.json文件下"args"參數中,即:
"args": [ ..."-g",//在"-g"和"-o"之間添加編譯時用到的C/C++源文件路徑"-o",...]
(1)第一種方法:將"${file}"、"${fileDirname}\\func.c"
添加進去。"${file}"
表示當前打開的活動文件,也就是hello.c文件路徑;"${fileDirname}\\func.c"
表示func.c文件路徑。
(2)第二種方法:將"${file}"、"${workspaceFolder}\\day1\\func.c"
添加進去;"${workspaceFolder}\\day1\\func.c"
表示func.c文件路徑。
(3)第三種方法:前兩種方法需要手動地將每個源文件路徑添加進去,太麻煩了。所以可以將"${fileDirname}\\*.c"
添加進去,此命令相當于把所有后綴名為.c的文件路徑都添加進去。
(4)如果是C++源文件,將后綴名".c"換成".cpp"即可。
(5)tasks.json配置文件中的內容更改如下,launch.json保持不變。
{"tasks": [{"type": "cppbuild","label": "C/C++: gcc.exe 生成活動文件","command": "d:\\AppInstall\\GCCAPP\\mingw64\\bin\\gcc.exe","args": ["-fdiagnostics-color=always","-g",// 第一種方法:"${file}","${fileDirname}\\func.c",// 第二種方法:// "${file}",// "${workspaceFolder}\\day1\\func.c",// 第三種方法:// "${fileDirname}\\*.c","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {"cwd": "d:\\AppInstall\\GCCAPP\\mingw64\\bin"// "cwd": "${fileDirname}":有時候"cwd"的值為:"${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "調試器生成的任務。"}],"version": "2.0.0"
}
7. 命令行方式編譯C++
(1)編譯單個C++文件:g++ -g "C++源文件" -o 編譯生成的可執行文件
,例如:g++ -g .\main.cpp -o main.exe
。
(2)編譯多個C++文件:g++ -g "C++源文件1" "C++源文件2" ... "C++源文件n" -o 編譯生成的可執行文件
,例如:g++ -g a.cpp b.cpp c.cpp -o multi_file.exe
。
(3)上面生成的可執行文件后綴名(.exe)可以省略。