VS Code:Windows下編寫運行C/C++程序(GCC)
1. 安裝Visual Studio Code
下載地址:https://code.visualstudio.com/Download
PS:"System Installer":對當前系統,好像方便獲取系統權限;"User Installer":對當前用戶,不好裝就用"System Installer"吧。
2. 在VS Code中安裝 C/C++擴展(快捷鍵:Ctrl+Shift+X)
3. 安裝Mingw-w64
下載地址:https://sourceforge.net/projects/mingw-w64/files/
-
方法一:直接下載在線安裝器(國內網絡不推薦)
- 運行安裝包。
- Architecture選擇x86_64,然后Next。
- 使用默認安裝文件夾繼續Next,安裝MinGW。
-
方法二:下載最新版本的
x86_64-posix-seh
1. 解壓下載的壓縮包到自己想要安裝的路徑下就算安裝完成。
4. 配置環境變量
- 復制“mingw64\bin”所在的路徑。
- 右鍵此電腦->屬性->高級系統設置->高級->環境變量。
- 在系統變量中找到
Path
,雙擊或選中點擊編輯
,在編輯環境變量
窗口選擇新建
,輸入bin
文件夾所在路徑(本機解壓后bin
文件夾所在的路徑:C:\Program Files\mingw64\bin
)。 - 點擊
確定
保存修改。
5. 驗證
命令提示符中運行以下命令查看是否有預期輸出,以驗證MINGW是否正確安裝:
g++ --version
gdb --version
6. 創建Hello World
通過命令提示符,創建project
空文件夾用於存放VS Code項目。然后打開該文件夾,在其下創建helloword
子文件夾,導航到這個子文件夾,並輸入code .
在該文件夾下打開VS Code。命令如下:
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
code .
命令在當前文件夾下打開了VS Code,該文件夾成為了你的“工作空間”。通讀教程后,你將看見工作空間的.vscode
文件夾下創建了三個文件:
task.json
(搭建說明)launch.json
(調試器設置)c_cpp_properties.json
(編譯器路徑和智能提示設置)
7.1. 添加源代碼文件
在"文件資源管理器"標題欄中,選擇"New File"按鈕並命名文件為helloworld.cpp
。
7.2. 添加hello world源代碼
復制下列代碼:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
}
Ctrl+S
進行保存。注意剛剛添加的文件是怎樣出現在VS Code側邊欄的File Explorer視圖(Ctrl+Shift+E
)中的:
你也可以啟用Auto Save
來自動保存文件的改變,通過選中File
下的Auto Save
。
最左邊的活動欄用於打開不同的視圖,比如Search,Source Control, 和Run。本教程后面的部分你會看到Run視圖。你可以在VS Code用戶界面文檔中找到更多關於其他視圖的信息。
便箋:當你保存或添加一個C++文件,你可以看見一個來自C/C++擴展關於內部版本可用性的通知,你可以用來測試新的特性和修正。
8. 探索智能提示
在你新的helloworld.cpp
文件中,鼠標懸停在vector
或者string
可以查看類型信息。在聲明msg
變量后,像調用成員函數一樣開始鍵入msg.
。你可以立刻看到一個顯示所有成員函數的補全列表,和一個顯示msg
對象類型信息的窗口:
你可以按Tab
鍵來插入已選擇的成員;然后,當你添加左括號時,你會看見關於這個函數所需的所有參數的信息。
9. 構建helloworld.cpp
接下來,你需要創建一個task.json
文件告訴VS Code怎樣構建(編譯)程序。這個任務將通過g++編譯器創建一個基於源代碼的可執行文件。
從主菜單欄選擇Terminal > Configure Default Build Task。下拉列表將會展示C++編譯器的各種預定義的構建活動下拉清單。選擇g++.exe build active file將生成當前在編輯器中顯示(活動)的文件。
這會在.vscode
文件夾下創建一個task.json
文件並在編輯器中打開。
你的新task.json
文件應該類似於下面的JSON:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: g++.exe build active file",
"command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe",
"args": ["-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe"],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
command
設置指定了要運行的程序;本例是g++。args
數組指定要傳給 g++ 的命令行參數。這些參數必需按照編譯器預期的順序指定。這個任務告訴g++獲取活動文件(${file}
),編譯它,並在當前目錄創建一個名字和活動文件一樣但擴展名是.exe
(${fileBasenameNoExtension}.exe
)的可執行文件(${fileDirname}),我們的示例結果是helloworld.exe
。
便箋:關於
task.json
變量,你可以在變量引用中了解更多。
label
的值是你將在任務列表中看到的值;你可以命名成任何你喜歡的名字。
group
對象中"isDefault": true
的值規定了當你按下Ctrl+Shift+B
時這個任務將會被運行。這個屬性只是為了方便,如果你設置為false,你依然可以在Terminal
菜單中用Run Build Task
運行它。
10. 運行構建
- 回到
helloworld.cpp
。你的任務構建了活動文件並且你要構建helloworld.cpp
. - 運行
task.json
中定義的構建任務,按Ctrl+Shift+B
或者從Terminal主菜單選擇Run Build Task - 當任務開始時,你需要查看源代碼編輯器下方的集成終端面板(TERMINAL)。任務完成后,終端顯示編譯器用來表示是否構建成功的輸出。對於成功的g++構建,輸出如下:
- 用
+
按鈕創建一個新的終端,你將會獲得一個以helloworld
文件夾為工作目錄的新終端。運行dir
你會看到可執行的helloworld.exe
。
- 你可以鍵入
helloworld.exe
(或者.\helloworld.exe
如果你使用PowerShell終端)在終端運行helloworld
。
修改tasks.json
你可以使用參數像"${workspaceFolder}\\*.cpp"
而不是${file}
來修改你的tasks.json
以構建多個C++文件。這將在你當前的文件夾構建所有的.cpp
文件。你也可以通過用一個硬編碼文件名(例如"${workspaceFolder}\\myProgram.exe"
)來替換"${fileDirname}\\${fileBasenameNoExtension}.exe"
以修改輸出文件名
11. 調試 helloworld.cpp
接下來,你將創建一個launch.json
文件來配置VS Code以在你按F5
調試程序的時候啟動 GDB 調試器。
1. 在主菜單選擇Run>Add Configuration...然后選擇C++(GDB/LLDB)。
2. 然后你會看到一個多種預定義調試配置的下拉列表。選擇g++.exe build and debug active file。
VS Code創建 launch.json
文件,在編輯器中打開它,並構建運行“helloworld”。
{
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe build active file"
}
]
}
program
指定想要調試的程序。這里設置為活動文件文件夾${fileDirname}
和擴展名為.exe
的活動文件名${fileBasenameNoExtension.exe}
,如果helloworld.cpp
是活動文件將會生成helloworld.exe
。
默認下,C++擴展不會在你的源代碼添加任何斷點,並且stopAtEntry
的被值設置為false
。
改變stopAtEntry
的值為true
以在你啟動調試器時讓調試器停止在main
方法上。
便箋:
preLaunchTask
用於指定在啟動之前要被執行的任務。確保它和task.json
文件的label
設置一致。
啟動一個調試會話
- 回到
helloworld.cpp
使其成為活動文件。 - 按
F5
或從主菜單選擇Run > Start Debugging。在開始單步執行源代碼之前,讓我們花點時間注意一下用戶界面的幾個變化:
- 集成終端顯示在源代碼編輯器的底部。在Debug Output選項卡中,可以看到指示調試器已啟動並正在運行的輸出。
- 編輯器突出顯示
main
方法中的第一條語句。這是C++擴展自動為您設置的斷點:
- 左側的運行視圖顯示調試信息。您將在后面的教程中看到一個示例。
- 在代碼編輯器的頂部,將顯示調試控制面板。你可以通過抓取左邊的點在屏幕上移動它。
12. 單步執行代碼
現在您可以開始單步執行代碼了。
-
單擊或按調試控制面板中的Step over圖標。
這將推進程序執行到for循環的第一行,並在msg
變量被創建和初始化時跳過所有涉及到的,在vector
和string
類中的內部函數的調用。注意左側Variables窗口的改變。
在本例中,錯誤時預期的,盡管循環變量名對調試器現在是可見的,語句尚未執行,所以此時沒有可讀取的。然而,msg
的內容是可見的,因為該語句已經完成。 -
再次按下Step over前進到這個程序的下一個語句(跳過所有用於初始化循環而被執行的內部代碼)。現在,Variables窗口顯示有關循環變量的信息。
-
再次按下Step over來執行
count
語句。(注意截至2019年三月發行的版本,C++擴展不在Debug Consle
打印任何輸出直到退出循環。) -
如果你願意,可以一直按Step over,直到vector中所有單詞都被打印到控制台。但是如果你好奇,試着按下Step Into按鈕在C++標准庫里來單步執行源代碼。
要返回你自己的代碼,一種方式是繼續按Step over。另一種方式是通過在編輯器中切換到hellworld.cpp
標簽在你的代碼設置一個斷點,將插入點放在循環內count
語句上的某個位置,並按F9
。左側空白處會出現一個紅色的點表示這行設置了一個斷點。
然后按F5
來從標准庫標題的當前行開始執行。執行將在cout
處中斷。如果你願意,你可以再按F9
關閉斷點。
當循環完成時,你可以在集成終端看見輸出,以及一些其他由GDB輸出的診斷信息。
13. 設置監視
有時你可能想在程序執行的時候追蹤變量的值。你可以通過在變量上設置監視來做到這一點。
- 在循環內放置插入點。在
Watch
窗口,點擊加號並在文本框中鍵入word
,這是循環變量的名稱。現在在單步執行循環時查看監視窗口。
- 通過在循環前添加這個語句添加另一個監視:
int i = 0;
。然后,在循環內,添加這個語句:++i;
。現在像你上一步做的那樣為i
添加監視。 - 快速觀察當執行通過斷點時變量的值。你可以用鼠標指針懸停在它上面。
14. C/C++配置
如果你想要對C/C++擴展有更好的控制,你可以創建一個c_cpp_properties.json
文件,允許你改變設置,例如編譯器的路線,包括路徑、C++標准(默認是C++17)等。
你可以從Command Palette (Ctrl+Shift+P)
通過運行命令C/C++: Edit Configurations (UI)查看C/C++配置UI。
這打開了C/C++ Configurations頁面。當你對這里進行變更時,VS Code將它們寫入一個在.vscode
文件夾中,名為c_cpp_properties.json
的文件。
這里,我們將Configuration name改為GCC,設置Compiler path下拉列表到g++編譯器,IntelliSense mode與編譯器(gcc-x64)匹配。
Visual Studio Code 將這些設置放在.vscode\c_cpp_properties.json
。如果你直接打開這個文件,它大致如下:
{
"configurations": [
{
"name": "GCC",
"includePath": ["${workspaceFolder}/**"],
"defines": ["_DEBUG", "UNICODE", "_UNICODE"],
"windowsSdkVersion": "10.0.18362.0",
"compilerPath": "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe",
"cStandard": "c11",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
你只需要添加到Include path數組設置如果你的程序包括不在你的工作空間或在標准庫路徑的頭文件。
15. 編譯器路徑
擴展使用compilerPath
設置來推斷C++標准庫頭文件的路徑。當擴展直到在哪里可以找到這些文件時,它會提供諸如智能補全和Go to Definition導航。
C/C++擴展嘗試用基於它在系統中找到的默認編譯器位置來填充compilerPath
。該擴展在幾個常見的編譯器位置查找。
compilerPath
搜索順序為:
- 首先檢查Microsoft Visual C++編譯器
- 然后在Windows子系統 for Linux(WSL)上查找g++
- 然后是Mingw-w64的g++。
如果你安裝了Visual Studio或者WSL,你或許需要變更compilerPath
來為你的項目匹配首選編譯器。例如,如果你安裝了使用i686架構的Mingw-w64 8.1.0 版本,Win32線程,sjlj異常處理安裝選項,路徑應該是這樣的C:\Program Files (x86)\mingw-w64\i686-8.1.0-win32-sjlj-rt_v6-rev0
。
下一步
- 瀏覽VS Code User Guide
- 回顧Overview of the C++ extension.
- 創建一個新的工作空間,復制你的
.vscode
JSON文件到這,調整新工作空間路徑的必要設置,項目名稱,等等,並開始編碼!