Deepin Linux 下用 vscode 調試 C/C++ 程序
現在網上的大部分類似博客都是錯的、有問題的、麻煩的;
而你如果有幸讀到我的這篇文章,那么恭喜你,我的是正確的,沒問題的,簡單的。
Deepin Linux 的問題
我的系統是:Deepin Linux 15.5 桌面版 ,但是和 Ubuntu,debian 系的 linux 系統都是類似的。
Linux xxx 4.14.0-deepin2-amd64 #1 SMP PREEMPT Deepin 4.14.12-2 (2018-01-06) x86_64 GNU/Linux
- vscode 在deepin上的應用商店里有下載,不過不一定最新,如果更新,去官網。
- 系統沒有GDB,需要安裝:sudo apt install gdb
-
沒有 Xterm 終端,需要安裝:sudo apt install XTerm
(最新版的vscode,現在是2019年吧...,已經不用裝這個了,自帶的就可以。)
參考文獻: Deepin Linux安裝使用Visual Studio Code(VSCode)調試C++
Visual Studio Code 的問題
我的版本:(此時有更新了,我沒有更新到1.21.1)
版本 1.21.0
提交 9a199d77c82fcb82f39c68bb33c614af01c111ba
日期 2018-03-07T11:01:43.521Z
Shell 1.7.9
渲染器 58.0.3029.110
Node 7.9.0
架構 x64
安裝編譯和調試的插件(點擊插件 - 安裝擴展) ,輸入:ext install cpptools
-
從 vscode 的菜單欄上點擊【打開文件夾】,選擇你的 C/C++ 項目文件夾,進入程序,設置斷點,F5調試,報錯,沒有配置,我們選擇 C++(GDB) 調試,添加配置,然后,會在你的項目目錄下,生成一個.vscode 文件夾, 里頭有一個 launch.json , 先不管它, 在 vscode 的資源管理器中,右鍵 .vscode ,【新建文件】,名字為 tasks.json 。
launch.json
{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceRoot}/${fileBasenameNoExtension}.o", "args": [], "stopAtEntry": false, "cwd": "${workspaceRoot}", "environment": [], "externalConsole": true, "preLaunchTask": "build", "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }
先看"cwd" : 這里是 "${workspaceRoot}" ,你如果搜索過相關專題,也許會注意到有兩個 $變量, 一個是:“${workspaceFolder}” , 另一個就是 "${workspaceRoot}" ,那么這兩個有什么區別?我不清楚,如果你想了解,請去 issues page 上查, 這里我想說的是,當你用 【文件】——> 【打開文件夾】這種方式打開的時候,你當前的項目目錄就是 "${workspaceRoot}" ;而你右鍵 vscode 資源管理器的項目文件夾,點擊【復制路徑】時,就是:"${workspaceFolder}" , 當然,也許你會發現沒啥區別,但我希望你知道,嘖嘖嘖,你知道嗎?
再看"program": 這里是 "${workspaceRoot}/${fileBasenameNoExtension}.o" ,我們來談談 ${fileBasenameNoExtension} ,有些博客里是{file} ,但你很快就會發現,如果用 ${file} 變量,那么你生成的程序就是 name.cpp.o , 沒錯,NoExtension 就是去掉擴展名的意思,就這么簡單。
最后看一下"preLaunchTask": 為什么我們要加這句話?因為我們調試,就需要生成供我們調試的文件,也就是說,調試前,我們要先執行 “build” 任務,(build 這個名字是我隨便起的) ,而 build 任務就是 tasks.json 中的內容。
參考資料:
${workspaceRoot} in launch.json is not the Folder path
tasks.json
{ "version": "0.1.0", "showOutput": "always", "tasks": [ { "taskName": "build", "command": "g++", // C 語言就 gcc "isShellCommand": true, "showOutput": "always", "args": ["-g","${file}", "-o", "${workspaceRoot}/${fileBasenameNoExtension}.o"] // g++ 后面的命令參數 } ] }
其實已經沒什么好說的了,主要就是 "command" 和 "args" ,如果你知道調試命令,那么就自己配置適合自己的調試方式,我這里的例子是:
# 生成 debug 文件程序 g++ -g server.cpp -o server.o # 抽象出來就是下面的這條命令: g++ -g ${file} -o ${workspaceRoot}/${fileBasenameNoExtension}.o
最后,注意到 “taskName” 中的 ”build“ , 要和 launch.json 中的 “preLaunchTask'' 中的名字對應上,這樣vscode才能找到。
參考資料:
?
用 Code Runner 編譯運行 C/C++ 代碼
-
配置好你的編譯器路徑,確保可以
如何驗證,在命令行輸入,若有相關信息輸出則說明已配置成功
g++ -v
安裝VSCode的插件Code Runner
-
修改Code Runner的一些設置以方便能夠在命令行中使用
"code-runner.runInTerminal": true, "code-runner.ignoreSelection": true, "code-runner.saveAllFilesBeforeRun": true,
編寫代碼并使用Code Runner ,編寫完代碼,右鍵-Run Code 或者按Ctrl+Alt+N
參考資料:
VSCode下便捷編譯運行C++代碼——Code Runner配置及說明
結語
我知道你看到這里,也許會有些許收獲,但更多的是”好氣“!沒錯,我寫這篇文章的時候,就是帶著”好氣“的心情寫的。為什么?因為我用 Google 搜索了半天的教程,大部分都是錯誤的,要不然就是很麻煩,不能通用,知其然不知其所以然,所以我寫下這篇文章,希望這篇文章能成為中文版 vscode 相關問題教程的一股清流(泥石流) 。
我寫這篇文章的時候,我的愛人就在旁邊看著,對我說:”你這樣氣人,遲早是要被別人打的~“ ,哈哈,如果你真的感到好氣,或者對我文章中的語氣很不爽,那么我真誠地希望你能完善我這篇文章,這篇文章里還有很多缺陷,
比如 :
- 兩個 json 文件中的許多配置沒有說明、加注釋;
- 沒有 Windows 和 MacOS 下的配置;
- workspaceRoot 和 workspaceFolder 兩個變量有什么區別 ;
- 還有很多... ... 我就不打自己臉了;
希望你能多看官方文檔,多去看外國佬的解決方法,我不是說外國的就怎么怎么好,畢竟,相比國內開發者,外國佬人更多,他們遇到的問題和解決問題的人更加龐大,高質量的博客也就更多,而國內的技術博客......???
Vscode官方參考資料:
C/C++ for VS Code (Preview)
?