在Windows 10系統中配置VS Code下的C

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語言插件。


在Windows 10系統中配置VS Code下的C/C++開發環境


  • 創建一個空文件夾,並在其中創建演示用的項目文件。通過命令行操作時順序如下:


<code>mkdir projects
cd projects
mkdir helloworld
cd helloworld
code ./<code>


最後一行code .命令是在命令行下快速調用code打開當前文件夾的指令,在實際使用中非常方便。


  • 在文件夾中添加一個helloworld.cpp文件(可以通過vs code創建)幷包含以下內容(代碼來自vs code官網)


<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;
}/<string>/<string>/<vector>/<iostream>/<code>


  • 如果要在WSL(Windows Subsystem Linux,windows內置的Linux子系統)下運行,還需要安裝 Remote-WSL extension插件。安裝方式與其他插件安裝方式相同。
  • 在安裝完c/c插件後,編寫c/c代碼時,就可以看到VS Code的智能感知(IntelliSense)系統了,這也是VS Code引以為傲的地方之一,在編寫代碼時,可以自動為程序員提供快速建議和完善語句的參考。


在Windows 10系統中配置VS Code下的C/C++開發環境


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命令包括:


<code>pacman -Sy 更新軟件包數據
pacman -R package-name 刪除軟件包
pacman -S package-name 安裝軟件包
pacman -Syu 更新所有
pacman -Ss xx 查詢軟件xx的信息/<code>


安裝gcc,gdb。可以根據需要選擇安裝32位或64位gcc,gdb發行版。

如果需要安裝32位軟件包。可輸入


<code>pacman -S mingw32/mingw-w64-i686-gcc
pacman -S mingw32/mingw-w64-i686-gdb/<code>


如果要安裝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以及相應的軟件包對應的安裝路徑)


在Windows 10系統中配置VS Code下的C/C++開發環境


打開命令行,輸入下列命令,如果能看到相應的版本信息,則說明安裝和路徑設置成功。


<code>C:\\Users\\weizy>g++ --version
g++ (Rev1, Built by MSYS2 project) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

C:\\Users\\weizy>gdb --version
GNU gdb (GDB) 9.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law./<http>/<code>


2.4 配置task.json文件


回到helloworld.cpp文件所在的目錄下,用vs code打開文件夾,選擇Terminal-->Configure Default Build Task(終端,配置默認build任務),選擇c/c++: g++.exe build active file,會創建一個新的tasks.json文件。參考官網示例編輯該文件如下:


<code>{
"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
}
}
]
}/<code>


  • 這個配置文件中,用到了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,即可通過清華大學開源軟件站倉庫更新軟件。


<code># 默認註釋了源碼鏡像以提高 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 multiverse
deb 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 multiverse
deb 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 multiverse
deb 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/<code>


3.2 安裝編譯環境


在WSL子系統中輸入以下命令以安裝編譯環境。


<code>sudo apt-get install build-essential gdb/<code>


安裝完成後可輸入以下命令檢查是否安裝成功。


<code>whereis g++
whereis gdb/<code>


3.3 通過VS Code打開WSL子系統並配置編譯C++文件


安裝完VS Code的Remote-WSL插件後,可以通過下列方式在VS Code中打開WSL子系統。

在Windows 10系統中配置VS Code下的C/C++開發環境


通過VS Code打開子系統後,同樣需要為WSL子系統安裝C/C插件,以實現後續的調試等功能。在插件欄中搜索C安裝即可。


和前一節類似地,在WSL中新建helloworld文件夾,並在其中新建helloworld.cpp文件。參考VS Code官網配置tasks.json文件如下。


<code>{
"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
}
}
]
}/<code>


注意:


  • 在linux系統下並不會通過文件後綴來判斷文件是否可執行,因此.exe的後綴是沒有必要的。只要文件權限中包含x執行權限即可執行。參考前節進行編譯後,即可生成helloworld文件,在終端中執行可看到輸出情況。
  • 在WSL子系統中,windows原有盤符映射到了/mnt目錄下,比如c盤路徑為/mnt/c,d盤為/mnt/d,為了方便兩個系統的文件互通,我在d盤新建了wsl目錄,並將其通過軟連接連接到WSL子系統的主目錄下,這樣在該文件夾中的文件可以很方便的通過兩個系統查找使用。linux下建立該軟連接的命令如下。


<code>mkdir /mnt/d/wsl
ln -s /mnt/d/wsl ~/wsl/<code>


4. 程序調試


4.1 配置


一般來說,程序設計不可能一蹴而就就可以編譯成功的。在編譯前可能需要大量的調試工作。和編譯類似,程序調試也需要在VS Code中進行配置。選擇Run-->Add Configuration(運行-->添加配置)添加配置,選擇C++(GDB/LLDB)(如果默認沒有出現,則需選擇最下面的more進行安裝相應插件)。在下拉菜單中選擇需要的編譯器,使用windows下的gcc時選擇g++.exe,使用WSL子系統時選擇g++ build and debug active file.截圖分別如下。


在Windows 10系統中配置VS Code下的C/C++開發環境


在Windows 10系統中配置VS Code下的C/C++開發環境


該選擇會生成不同的launch.json文件。在windows系統的gcc編譯器下launch.json文件如下(目錄已修改為和實際目錄一致)


<code>{
// 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"
}
]
}/<code>


在WSL子系統下的lauch.json配置文件如下:


<code>{
// 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"
}
]
}/<code>


4..2 程序調試


回到helloworld.cpp下,按F5或者選擇Run-->Start Debugging開始進行程序調試。如果使用過Visual Studio或者其他IDE工具,就會發現其中的相似性,在程序段左側的代碼行數標識左邊,可以通過鼠標給程序打斷點(break point),這樣在調試時遇到相應斷點會自動停下,這在調試時都是很有用的功能。


在Windows 10系統中配置VS Code下的C/C++開發環境


關於調試另外一個很有用的功能是watch。在調試開始後,程序欄左側會出現watch窗口。在watch窗口中可以輸入想要監視的變量,例如本例中的變量名為word的變量。雙擊watch窗口下的空白處並輸入watch,在程序步進執行(上圖中按鈕)時,就可以看到隨著程序執行,watch變量不斷變化的值。這個比起調試時用print輸出變量要方便又好用的多。


在Windows 10系統中配置VS Code下的C/C++開發環境


分享到:


相關文章: