windows下使用vscode編寫運行以及調試C/C++


不要轉載,唯一出處tnnmigga博客園

最后更新於2019年8月12日:

這篇文章已經更新了2.x版本,添加了一些新內容和修正了一些錯誤

新文章的地址是https://zhuanlan.zhihu.com/p/77645306

 

-----------------------------下面是原文章---------------------------------

vscode支持類似於vs的斷點調試c/c++,也可以直接編譯&運行c/c++

 

先是編譯運行 c/c++的方法                             

 

微軟官方起初設定的科學做法(這也是現在的科學做法)是通過在vscode集成控制台寫命令行的方式來實現編譯運行程序的,但也可以通過code runner插件來簡化步驟,實現一鍵編譯執行

但無論是什么方法,因為vscode本身並不帶有編譯器,都需要自己提前安裝好一個c/c++編譯器(如mingw,clang)並且配置好環境變量(不會請點擊這里)

控制台下編譯運行C/C++(如果不懂命令行操作可以暫時跳過這里):

按 ctrl + ~ 打開vscode控制台,點擊終端,在vscode的終端下操作其實就是在windows下的cmd或者powershell下操作,一切的編譯運行等操作可以用輸入命令行的方式來實現,只要掌握各自的編譯器的命令行指令就能讓程序在vscode界面上運行起來

c/c++編譯器的那一套自然不在話下(如下圖),先用cd 命令切換到源文件目錄或者直接輸入完整路徑名,然后用編譯器指令(假設編譯器是mingw) g++ xxx.cpp -o xxx.exe編譯,接着再輸入./xxx.exe就可以運行編譯好的程序

其他的c/c++編譯器如clang包括其他語言(Python ,Go,Java...)都可以類似的這樣操作

 

 

 

便捷方式是使用code runner插件:

code runner插件默認的c/c++編譯器是gcc/g++,需要提前安裝好並且設置好環境變量,通常選擇MinGW或者MinGW-w64,建議選mingw-w64,一般用戶建議下載離線版解壓后添加環境變量,離線版下載地址:鏈接

不會請看:安裝mingw-w64具體過程

同時,code runner插件使用的編譯器是可以被修改為gcc/g++以外的編譯器的(比如clang,MSVC),有這方面需要請看:vscode修改code runner使用的編譯器

mingw和mingw-w64是有區別的,直觀的說,mingw-w64更加強大

安裝好並且設置好二者中的一個,並設置好環境變量后在cmd下輸入gcc -v確認是否成功,出現關於gcc -v的相關信息(如下圖)就表示成功

 

接着點擊vscode左側面板中的插件商店按鈕

安裝好下面兩個插件

C/C++

Code runner

如果需要中文請安裝一個chinese插件

 

注意,如果沒安裝clang的話不要安裝推薦插件里的c/c++ clang插件,否則應該會報錯

 

安裝好后重啟一下vscode這樣就能在右上角看見一個三角形了,打開文件點擊就能編譯執行

但此時會有這樣一個問題

如果程序里有scanf()等請求鍵盤輸入數據的函數,此時無法從鍵盤輸入數據,並且程序無法結束需要關閉重啟vscode才能重新執行

 

 

解決辦法是依次打開:文件>首選項>設置>用戶設置>拓展>Run Code Configuration

找到  Run In Terminal  打上勾 這樣運行的程序就會運行在vscode的集成控制台上

在工作區設置也有這個選項,但工作區設置只會對工作區生效

這樣問題就能解決了

 運行一段測試代碼

#include<bits/stdc++.h>  
using namespace std;  
  
int main(){  
    cout<<"hello"<<endl;  
    int u;  
    while(cin>>u){  
        cout<<u*u<<endl;  
    }  
}  

 

這時輸出信息會顯示在終端欄下面

隨便輸入測試數據

可以看到下圖的效果

 

點擊右上角的垃圾桶能提前結束程序運行

code runner插件有一個局限,code runner插件的原理其實是自動在控制台下幫助我們輸入g++ xxx.cpp -o xxx.exe(假設是默認情況)這條編譯指令,不會再添加額外的命令,比如如果代碼中使用了winsock2用g++編譯的話需要額外添加-lwsock32指令,即完整指令為g++ xxx.cpp -o xxx.exe -lwsock32,此時直接使用code runner的話會無法編譯,這種情況應該使用上面提到的vscode集成控制台手動輸入編譯指令編譯

 

調試 c/c++方法          

首先一點:不支持中文路徑!!!(文件名和整個文件路徑名中都不能有中文,否則無法調試,是由mingw不支持中文路徑造成的)

實際效果類似vs那樣按f5斷點調試

首先選中一個用於存放各種代碼的文件夾作為根路徑也就是工作區,因為調試只會對根路徑下的文件生效!!!

在vscode中打開這個文件夾(文件>打開文件夾>選中你的文件夾)

之后再在這個文件夾新建一個 .vscode 的文件夾,不要忘了開頭的 "." 號(如果已有則不必再額外新建)

再在.vscode文件夾中新建兩個配置文件 launch.json 和 tasks.json

類似於下圖

 

之后再把下面的兩個段代碼粘貼到對應的文件里

這里需要修改一處:launch中 "miDebuggerPath" 選項需要設置為你的調試器(gdb.exe)所在位置 這里的是我電腦上MinGW -w64的安裝位置

無論安裝的是MinGW還是mingw-w64,都會有一個gdb.exe在安裝目錄的bin文件夾下,一定要把對應的路徑修正否則無法調試

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C/C++",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "miDebuggerPath": "C:/Program Files/mingw64/bin/gdb.exe",
            "preLaunchTask": "g++",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
        },
    ]
}

tasks.json

{
    "version": "2.0.0",
    "command": "g++",
    "args": [
        "-g",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}.exe"
    ],
    "problemMatcher": {
        "owner": "cpp",
        "fileLocation": [
            "relative",
            "${workspaceRoot}"
        ],
        "pattern": {
            "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
            "file": 1,
            "line": 2,
            "column": 3,
            "severity": 4,
            "message": 5
        }
    },
    "group": {
        "kind": "build",
        "isDefault": true
    }
}

之后打開在當前工作區子目錄下的.c/cpp文件就可以添加斷點進行調試了

此時可以按 ctrl+shift+b 直接調用配置好的g++ task 編譯程序而不運行程序,類似於一些IDE的編譯選項

如果我們要查看當前某個變量的值或者某個表達式的值,可以像vs一樣在左側的調試面板添加監視

也可以在下方的調試控制台里直接輸入表達式或者變量名

當然,最簡單的還是鼠標直接移動到變量上,往往直接就顯示出來了,如果靠這樣不能解決的話,就試試上面兩種方法

 

vscode支持實時報錯,遇到找不到頭文件的問題請點擊 

 

 

也可以讓c/c++程序的調試在vscode的集成控制台上進行,不在額外顯示黑窗口,類似於code runner的界面效果

只需將launch.json中的 "externalConsole" 項由 true 改為 false 

經評論區提醒

此時可能會遇到這樣一個問題,如果你的輸入法當前是中文輸入的話,輸入數據時會很長時間才能反應過來,只需要按shift將輸入法切換到英文狀態就不會遇到這個問題了,可以直接設置輸入法首選項為英文

效果

類似於code runner的問題: 如果是需要有額外的編譯指令如-lwsock32,需要調試前事先在tasks.json的args處添加上對應的指令,或者用 // 注釋掉launch.json中的 preLaunchTask:"g++"(啟動調試前執行g++編譯按tasks指令格式編譯) 這一項,然后自己在按ctrl + ~ 打開終端手動編譯好后再執行調試

 

記住:調試是屬於工作區設置,當前配置的調試環境只會對當前.vscode文件夾所在路徑下的文件生效,如果要換用別的文件夾,把.vscode這個文件夾拷貝過去即可

 

最后,我使用的主題插件為tangming Themes,感興趣的可以去插件商店下載,里面一共四個主題

 

似乎有很多打ACM的同學在看,再提醒一點,在上面提到集成終端下調試,將題目測試數據粘貼到命令行,測試到一半就發現問題,點重新啟程調試的按鈕,會因為剩余的數據未被讀取而造成錯誤

比如這樣的錯誤信息:

所在位置 行:1 字符: 2
+ 5& 'c:\Users\tangm\.vscode\extensions\ms-vscode.cpptools-0.24.1\debug ...
+  ~
表達式或語句中包含意外的標記“&”。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

正常現象,再重新點一下啟動就可以了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM