VS Code作為一款最受程式設計師歡迎的輕量級的程式編輯器,在使用方面有著無可替代的靈活性與優勢。但同樣由於其輕量級和靈活性,在進行開發時,也有很多需要自行手動配置的地方,不像其臃腫的同門兄弟Visual Studio(雖然VS Code與Visual Studio相似之處僅僅在於名稱和同是微軟出品)那樣,讓很多操作都傻瓜化。對於新手來說,傻瓜化的操作當然有其便捷性,但失去了配置的過程,很多人雖然在VisualStudio下可以寫出能執行的程式碼,但始終連程式是如何編譯、連結到執行的都搞不懂。
在VS Code官方文件中,對各種開發語言的配置方式都有詳盡的介紹,在Windows下進行C/C開發時,官方提供了三種不同的配置方式,分別是使用Microsoft C,Windows下的GCC和利用Windows10內建的WSL linux子系統的GCC進行開發和配置。本文僅就後兩種方式進行示例和介紹。
1. 準備工作在安裝完Visual Studio Code後,要進行C/C開發時,需要先安裝C/C語言外掛。建立一個空資料夾,並在其中建立演示用的專案檔案。通過命令列操作時順序如下:mkdir projectscd projectsmkdir helloworldcd helloworldcode .最後一行code .命令是在命令列下快速呼叫code開啟當前資料夾的指令,在實際使用中非常方便。
在資料夾中新增一個helloworld.cpp檔案(可以通過vs code建立)幷包含以下內容(程式碼來自vs code官網)#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;}如果要在WSL(Windows Subsystem Linux,windows內建的Linux子系統)下執行,還需要安裝 Remote-WSL extension外掛。安裝方式與其他外掛安裝方式相同。在安裝完c/c外掛後,編寫c/c程式碼時,就可以看到VS Code的智慧感知(IntelliSense)系統了,這也是VS Code引以為傲的地方之一,在編寫程式碼時,可以自動為程式設計師提供快速建議和完善語句的參考。2. 在Windows下安裝GCC並進行C++語言開發按照官方的指導,要在Windows下安裝開源的GCC編譯器,需要安裝Mingw-w64,這是GCC在Windows下執行的版本。在Mingw-w64官網可以開到不同的發行版本,一般來說推薦僅安裝官方的mingw-w64即可,但由於國內網路環境的原因,直接安裝mingw-w64可能是非常緩慢甚至難以成功的。這裡選擇安裝mingw-w64的一個名為MSYS2的發行版進行安裝,並通過清華大學開源軟體映象站進行加速。
2.1 安裝 msys2按照清華大學開源軟體映象站(或者USTC映象)的官方說明,在該網站MSYS2資料夾下的distrib/目錄下選擇相應的名為msys2-<架構>-<日期>.exe檔案下載並安裝。一般建議直接安裝在 C:/msys2 目錄下。安裝完成後,在該目錄下查詢並編輯以下檔案,以使用清華開源站的軟體倉庫來代替預設的海外倉庫:
編輯 /etc/pacman.d/mirrorlist.mingw32 ,在檔案開頭新增:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
編輯 /etc/pacman.d/mirrorlist.mingw64 ,在檔案開頭新增:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
編輯 /etc/pacman.d/mirrorlist.msys ,在檔案開頭新增:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch
然後開啟msys2.ext檔案,在命令列執行 pacman -Sy 重新整理軟體包資料.
pacman是arch linux下的包管理器,與centos下的yum或者ubuntu下的apt類似。要在msys2下查詢並安裝linux相容的軟體包,需要通過pacman進行。
2.2 使用pacman安裝軟體包常用的pacman命令包括:
pacman -Sy 更新軟體包資料pacman -R package-name 刪除軟體包pacman -S package-name 安裝軟體包pacman -Syu 更新所有pacman -Ss xx 查詢軟體xx的資訊安裝gcc,gdb。可以根據需要選擇安裝32位或64位gcc,gdb發行版。
如果需要安裝32位軟體包。可輸入
pacman -S mingw32/mingw-w64-i686-gccpacman -S mingw32/mingw-w64-i686-gdb如果要安裝64位包,可以相應的改為mingw64/mingw-w64-x86_64-gcc等。也可以直接將gcc改為toolchain,可完整安裝整個工具鏈。
2.3 設定環境變數安裝完成後,需要將對應的c:/msys2/mingw32/bin或者c:/msys2/mingw64/bin新增到windows系統路徑的path下。新增方式如下:
(Win+R並輸入control)開啟控制面板-->系統-->高階系統設定
在彈出視窗中選擇高階-->環境變數,在下方的系統變數中尋找Path並雙擊。選擇新建並輸入上述路徑(msys2以及相應的軟體包對應的安裝路徑)
開啟命令列,輸入下列命令,如果能看到相應的版本資訊,則說明安裝和路徑設定成功。
C:\\Users\\weizy>g++ --versiong++ (Rev1, Built by MSYS2 project) 9.3.0Copyright (C) 2019 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.C:\\Users\\weizy>gdb --versionGNU gdb (GDB) 9.1Copyright (C) 2020 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.
2.4 配置task.json檔案
回到helloworld.cpp檔案所在的目錄下,用vs code開啟資料夾,選擇Terminal-->Configure Default Build Task(終端,配置預設build任務),選擇c/c++: g++.exe build active file,會建立一個新的tasks.json檔案。參考官網示例編輯該檔案如下:
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "g++.exe build active file", "command": "C:\\\\msys2\\\\mingw32\\\\\\bin\\\\g++.exe", "args": ["-g", "${file}", "-o", "${fileDirname}\\\\${fileBasenameNoExtension}.exe"], "options": { "cwd": "C:\\\\msys2\\\\mingw32\\\\bin" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true } } ]}
這個配置檔案中,用到了vs code內建的變數來使配置檔案更靈活。${fileBasenameNoExtension}表示要編譯檔案不含副檔名的名字,加上字尾就會編譯為.exe檔案,本例中即編譯出helloworld.exe檔案,${fileDirname}表示檔案所在目錄,VS code官網列出了所有的系統變數參考command和cwd中的資料夾要和實際安裝的位置一致,並且用雙反斜槓來表示檔案路徑。考慮到該配置檔案的通用性,可以儲存並用於以後專案和檔案使用。2.5 執行編譯關閉task.json檔案並回到helloworld.cpp檔案(否則系統會認為要編譯的檔案是task.json)。選擇Terminal-->Tasks:Tun Build Task (終端-->任務:執行編譯任務),快捷鍵為Ctrl+Shift+B (這個快捷鍵和我的輸入法表情檔案衝突,需要修改掉)。一切正常的話編譯會迅速完成,並在相同目錄下生成helloworld.exe檔案。在終端執行 .\\helloworld.exe可以看到檔案的輸出結果。
3.在Windows的WSL子系統中通過GCC配置C++開發環境3.1 安裝Ubuntu Linux子系統可參考微軟官方的WSL子系統安裝說明,從windows store或者命令列下載並安裝。windows server也可以下載並且手動解壓縮和安裝。這裡在windows商店中搜索並安裝ubuntu18.04版本。安裝過程中兩個常見的錯誤及解決方案如下:
安裝失敗並出現錯誤 0x80070003適用於 Linux 的 Windows 子系統只能在系統驅動器(通常是 C: 驅動器)中執行。 請確保將分發版儲存在系統驅動器上:開啟“設定”->“儲存”->“更多儲存設定: 更改新內容的儲存位置”WslRegisterDistribution 失敗並出現錯誤 0x8007019e未啟用“適用於 Linux 的 Windows 子系統”可選元件:開啟“控制面板” -> “程式和功能” -> “開啟或關閉 Windows 功能”-> 選中“適用於 Linux 的 Windows 子系統”,或使或開啟Windows Power Shell並且命Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux安裝完成後,在開始選單中搜索Ubuntu即可開啟WSL的ubuntu linux子環境,在命令列輸入bash也可直接進入ubuntu bash‘中。第一次今進入WSL子系統時需要設定Linux子系統的使用者名稱和密碼。
為了提高訪問速度,這裡同樣使用清華大學開源軟體站的倉庫替換預設的Ubuntu倉庫。方法為修改ubuntu檔案/etc/apt/sources.list(修改前建議先備份該檔案),將檔案內容替換為以下內容,儲存檔案後輸入sudo apt-get update,即可通過清華大學開源軟體站倉庫更新軟體。
# 預設註釋了原始碼映象以提高 apt update 速度,如有需要可自行取消註釋deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse# 預釋出軟體源,不建議啟用# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
3.2 安裝編譯環境在WSL子系統中輸入以下命令以安裝編譯環境。
sudo apt-get install build-essential gdb
安裝完成後可輸入以下命令檢查是否安裝成功。
whereis g++whereis gdb
3.3 通過VS Code開啟WSL子系統並配置編譯C++檔案
安裝完VS Code的Remote-WSL外掛後,可以通過下列方式在VS Code中開啟WSL子系統。
通過VS Code開啟子系統後,同樣需要為WSL子系統安裝C/C外掛,以實現後續的除錯等功能。在外掛欄中搜索C安裝即可。
和前一節類似地,在WSL中新建helloworld資料夾,並在其中新建helloworld.cpp檔案。參考VS Code官網配置tasks.json檔案如下。
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "g++ build active file", "command": "/usr/bin/g++", "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"], "options": { "cwd": "/usr/bin" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true } } ] }
注意:
在linux系統下並不會通過檔案字尾來判斷檔案是否可執行,因此.exe的字尾是沒有必要的。只要檔案許可權中包含x執行許可權即可執行。參考前節進行編譯後,即可生成helloworld檔案,在終端中執行可看到輸出情況。在WSL子系統中,windows原有碟符對映到了/mnt目錄下,比如c盤路徑為/mnt/c,d盤為/mnt/d,為了方便兩個系統的檔案互通,我在d盤新建了wsl目錄,並將其通過軟連線連線到WSL子系統的主目錄下,這樣在該資料夾中的檔案可以很方便的通過兩個系統查詢使用。linux下建立該軟連線的命令如下。mkdir /mnt/d/wslln -s /mnt/d/wsl ~/wsl
4. 程式除錯4.1 配置
一般來說,程式設計不可能一蹴而就就可以編譯成功的。在編譯前可能需要大量的除錯工作。和編譯類似,程式除錯也需要在VS Code中進行配置。選擇Run-->Add Configuration(執行-->新增配置)新增配置,選擇C++(GDB/LLDB)(如果預設沒有出現,則需選擇最下面的more進行安裝相應外掛)。在下拉選單中選擇需要的編譯器,使用windows下的gcc時選擇g++.exe,使用WSL子系統時選擇g++ build and debug active file.截圖分別如下。
該選擇會生成不同的launch.json檔案。在windows系統的gcc編譯器下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": "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:\\\\msys2\\\\mingw32\\\\bin\\\\gdb.exe", "setupCommands": [ { "description": "為 gdb 啟用整齊列印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "g++.exe build active file" } ]}在WSL子系統下的lauch.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": "g++ build and debug active file", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "g++ build active file", "miDebuggerPath": "/usr/bin/gdb" } ]}4..2 程式除錯回到helloworld.cpp下,按F5或者選擇Run-->Start Debugging開始進行程式除錯。如果使用過Visual Studio或者其他IDE工具,就會發現其中的相似性,在程式段左側的程式碼行數標識左邊,可以通過滑鼠給程式打斷點(break point),這樣在除錯時遇到相應斷點會自動停下,這在除錯時都是很有用的功能。
關於除錯另外一個很有用的功能是watch。在除錯開始後,程式欄左側會出現watch視窗。在watch視窗中可以輸入想要監視的變數,例如本例中的變數名為word的變數。雙擊watch視窗下的空白處並輸入watch,在程式步進執行(上圖中按鈕)時,就可以看到隨著程式執行,watch變數不斷變化的值。這個比起除錯時用print輸出變數要方便又好用的多。