關於搭建vscode的開發環境來開發c網上已經有很多類似的貼子,但是幾乎都是直接給出tasks.json和launch.json文件,並未說明這兩個文件的作用以及如何配置。這里面向純小白着重說明下(1)應該怎么配置(2)為什么這么配置,另外也涉及到使用的一些其他工具如gcc、make也是面向純小白做的教程。
一、安裝gcc
gcc是一個編譯c的編譯器,網上一搜就能找到海量信息,這里注重強調Windows下安裝配置。
可以使用mingw-w64、MSYS2、Cygwin,個人喜歡用MSYS2(如果用過ArchLinux或者manjaro會很好適用),不建議mingw,已經許久沒更新了。
考慮到使用mingw-w64下載壓縮包解壓就可以,操作難度小很多。所以這里貼出mingw-w64的用法:去這個連接直接下載壓縮包。也可使用在線安裝器,但是速度很慢,我就直接下載的壓縮包。其余安裝方法可以參考我的另一個文章:Windows使用unix環境那些事
得到安裝包后解壓縮,然后我放置到了 “C:\Program Files\mingw-w64\” 目錄下,mingw-w64是手動創建的,然后再添加環境變量
上圖中的完整路徑是:C:\Program Files\mingw-w64\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\mingw64\bin
然后再powershell(或者cmd)中輸入 “gcc -v” 就能看見gcc版本號了,說明安裝成功。
二、安裝make
如果你不使用make工具,這一節可直接跳過。如果要使用makefile的話,需要安裝make工具,建議使用使用msys2來安裝。
關於msys2(Minimal Syetem 2)的介紹,可參考Windows使用unix環境那些事,去官網下載:https://www.msys2.org/ 官網首頁就有安裝教程,安裝后配置下環境變量。安裝后可能沒有make工具,使用 “pacman -S make” 命令即可完成安裝。
注:msys2更換成國內源速度會更快。詳情可參考我的另一文章:MSYS2換源
注:makefile的寫法可參考我的:makefile基本操作
三、build
vscode的task.json是什么?
task其實就類似於makefile,根據指定的規則build源文件。
我使用vscode的一般性流程是:編寫代碼 -> 編譯代碼 -> debug代碼。
task.json就是在第二個流程“編譯代碼”中生效的。當然你也可以不使用task而是使用makefile或者直接用命令編譯,比如我寫一個main.c文件,里面打印個helloworld,就可以
1、直接用命令:gcc -g main.c -o main.exe,編譯出可執行文件(linux下可不用指定.exe擴展名),然后就可以使用vscode來debug了。
2、使用makefile:如果源文件較多可以使用makefile,make編譯后再使用vscode debug。
那么使用task應該怎么做呢?
task可以讓vscode調用外部的Makefile,以及Make,Ant,Gulp,Jake,Rake和MSBuild之類的構建系統。
Windows、Linux按下ctrl+shift+p然后輸入tasks,找到taskconfig,添加一個,就可以在.vscode目錄下生成task.json文件。
在編譯和調試中會有很多變量比如{fileDirename}等等,下面是task中的變量參考:https://code.visualstudio.com/docs/editor/variables-reference
四、debug
(1)想要調試需要安裝調試器,常用的是gdb,另外還有lldb。
在(一、安裝gcc)中安裝的ming-w64中就已經帶有gdb。當然也可以使用msys2安裝,命令:pacman -S gdb。
(2)vscode的launch.json是什么?
launch.json是應用於上面說的流程中“debug代碼”部分的,主要作用是指定gdb(或者你是用lldb)的path,以及其他一些配置。下圖中是我的一個launch.json的配置,箭頭指向了我的gdb的path。
多數情況下,自動生成了launch.json后只需要修改兩個地方就行,一個是“program”:指定你的可執行文件(比如我上面的指定了工作目錄下的main.exe),另一個是指定gbd的目錄(上面箭頭)。
如果是Linux或者macOS,只要安裝了gdb之后,上面“miDebuggerPath”直接寫個“gdb”就行。
經過 “三、build” 步驟之后我們已經生成了帶有調試信息的可執行文件(不管你是直接用gcc命令、makefile還是用vscode的task),此時配置下launch.json指定出gdb目錄就能使用debug了。下面gif圖是我使用gcc命令直接編譯的,沒有用task。
launch.json的配置解析:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch", // 配置名稱,將會在啟動配置的下拉菜單中顯示
"type": "cppdbg", // 配置類型,這里只能為cppdbg
"request": "launch", // 請求配置類型,可以為launch(啟動)或attach(附加)
"program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 將要進行調試的程序的路徑
"args": [], // 程序調試時傳遞給程序的命令行參數,一般設為空即可
"stopAtEntry": false, // 設為true時程序將暫停在程序入口處,我一般設置為true
"cwd": "${workspaceFolder}", // 調試程序時的工作目錄
"environment": [], // (環境變量?)
"externalConsole": true, // 調試時是否顯示控制台窗口,一般設置為true顯示控制台
"internalConsoleOptions": "neverOpen", // 如果不設為neverOpen,調試時會跳到“調試控制台”選項卡,你應該不需要對gdb手動輸命令吧?
"MIMode": "gdb", // 指定連接的調試器,可以為gdb或lldb。但目前lldb在windows下沒有預編譯好的版本。
"miDebuggerPath": "gdb.exe", // 調試器路徑,Windows下后綴不能省略,Linux下則去掉
"setupCommands": [ // 用處未知,模板如此
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
"preLaunchTask": "Compile" // 調試會話開始前執行的任務,一般為編譯程序。與tasks.json的label相對應
}
]
}
未完待續······