LOX: 利用VSCode進行C/C++開發

文章框架

腦圖


前言

LOX(Lightweight Open-source Xplatform)是我正在編寫的一個全新文集,意思就如其名:輕量級-開源-跨平臺。就是這個系列中的文章和例程都符合輕量級(Lightweight)、開源(Open-Source)、跨平臺(Cross-Platform)。嗯,我這人吧,就好起一些新的名詞。
本篇作為LOX系列的第一篇,也向你展示了一個最簡單的LOX項目。如果想看一個稍微復雜一點的LOX項目,可以clone我Github上的一個Repo:2048 CLI。歡迎來搞~


單源文件

先從簡單的來,一個源文件。

工具

進行本次LOX開發所需要工具,點擊下面的Title進入官網下載。

VSCode是微軟出品的一款非常良心的輕量級編輯器,雖說是完全照著Sublime Text弄出來的,但它免費啊,還開源啊,所以我也就不深究模仿不模仿了。(嗨呀,原則呢?嗯?)

需要的插件

插件 標識符 說明
C/C++ ms-vscode.cpptools C/C++語言支持,簡單的編輯、編譯、調試等功能。

這個工具是在Windows上需要的。因為Windows沒有GNU工具包,MinGW就是為Windows而生的GNU工具包。

需要安裝的包

說明
mingw32-gcc.bin GNU C編譯器
mingw32-gcc-g++.bin GNU C++編譯器
mingw32-gdb.bin GNU 調試器

環境變量
在系統變量的PATH中,添加MinGW安裝的根目錄中的bin文件夾(如C:\MinGW\bin),且盡量將這一項往上移(為了優先搜索該目錄)。

設置過程

完成這一步后,如果打開了VSCode,記得要重啟VSCode。


編碼

建立工作空間

新建一個文件夾 - 右鍵 - Open with Code。使用這種方法的前提是你在安裝VSCode時選中了“”

Open with Code

或者在VSCode中 - 文件 - 打開文件夾,選中一個空文件夾作工作空間。

新建源文件
鼠標移動到新建的文件夾的根目錄處(我的是“HelloWorld”),點擊下圖藍色框住的圖標(新建文件)。

新建按鈕

之后在其中輸入文件名(包括后綴名),本例的后綴名寫".c"或".cpp"。然后在其中寫個最簡單的HelloWorld。

代碼

#include <stdio.h>
int main(){
    printf("Hello World");
    return 0;
}

編碼時,如果想自動補全,需要在包含指定頭文件后保存代碼,然后才會啟動自動補全。
也就是說,它只對保存后的代碼進行探測。


生成

生成快捷鍵:Ctrl(Mac: Command)+Shift+B
第一次生成時,VSCode會提示找不到生成的配置文件task.json,點擊“配置生成任務”。

配置生成任務

在給出的模板中選擇Others。在打開的task.json中改為下述代碼。

{
    "version": "0.1.0",
    "command": "gcc",
    "isShellCommand": true,    // 是否為Shell命令
    "args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.out"],
    "showOutput": "always"
}

其實作用就是代碼中所述的。
"command": "gcc""args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.out"]就相當于在Shell中直接鍵入gcc -c 源文件.c -o 源文件所在目錄/源文件.out。將鼠標放在Key(冒號前面的)上會顯示所對應的意思(下面的Launch.json同)。
簡單的解釋一下其中幾個$標識

標識 作用
${file} 當前文件的完整文件名(包括路徑、文件名、后綴名)
${fileDirname} 當前文件的路徑
${fileBasenameNoExtension} 當前文件的文件名(包括路徑、后綴名)

其中所說的“當前文件”指的是你在VSCode編輯器中打開的并正在編輯的文件。


當前正在編輯的文件

完成task.json的配置后,我們縮寫的程序已經可以運行了。生成的程序就是源文件所在根目錄中出現的與源文件同名但后綴名為.out的文件。


調試

我們當然不能僅僅滿足于生成出程序就行的,大部分情況我們是要調試的。

調試快捷鍵:F5

第一次按F5時和生成時一樣,找不到配置文件,在打開的模板中選C++ (GDB/LLDB)(可以跨平臺)。
生成的配置文件為launch.json

launch.json改為下述代碼
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",    // 本配置的名稱,隨便起
            "type": "cppdbg",
            "request": "launch",    // 如果調試的類型為附加進程,需將這里改為attach
            "program": "${fileDirname}/${fileBasenameNoExtension}.out",    // 要調試的程序路徑
            "stopAtEntry": false,    // 是否在起點處停頓
            "cwd": "${workspaceRoot}",
            "externalConsole": true,    // 在外部控制臺運行。若為false,則運行在VSCode自帶的控制臺中
            "linux": {    // Linux 系統下的配置
                "MIMode": "gdb"
            },
            "osx": {    // OS X系統下的配置
                "MIMode": "lldb"
            },
            "windows": {    // Windows 系統下的配置
                "MIMode": "gdb",
                "miDebuggerPath": "gdb.exe"
            }
        }
    ]
}

Windows默認是沒有gdb或lldb的,所以我們需要安裝MinGW中的gdb,并在這里設置gdb的路徑。只寫程序名是因為設置了環境變量。
完成launch.json的配置并切換到源代碼編輯頁之后

再一次:F5
打上斷點
合影留念


多源文件

什么!你不滿足于單源文件開發?!來來來,我給你看個寶貝。

的確,單源文件開發一般也就是個做做算法題,現在隨便寫個像樣的工程都是多個源文件編譯鏈接一條龍的。這樣VSCode可以嗎,也可以!但需要新的幫手:CMake。

工具

新需要的插件
實際上通過CMake在VSCode上進行項目開發可以不需要任何插件,但是用上這些插件之后你會發現這個過程會變得特別方便!
除去單源文件中所提到的cpptools,還需要下面的插件。

插件 標識符 說明
CMake twxs.cmake 提供CMake語法支持,包括高亮和自動補全等
CMake Tools vector-of-bool.cmake-tools 這個屌!完全把CMake封裝成一套VSCode底邊欄的工具集

同樣這一步僅在Windows上做。

需要新安裝的包

說明
mingw32-make.bin GNU Make,根據makefiles(在這里makefiles由CMake搞定)生成項目

為了方便調用,我一般會把mingw32-make.exe在其目錄中復制一份出來,命名為make.exe
這一步某種程度意義上講還蠻重要的,第一是方便自己調用(直接在shell里make),第二是方便vscode的插件調用(如果不弄一個cmake.exe出來的話,vector-of-bool.cmake-tools會報錯,不過具體鍋是vector-of-bool.cmake-tools還是twxs.cmake的也不太清楚,目前vector-of-bool已經把這個問題(#157)標記為bug,并打算在0.10.0版本解決。)。

安裝時記得將Add CMake to system PATH勾上。是for all users呢還是for current user你自己看咯。


編碼

上個例子是C,那這個就上C++好了。

目錄結構

我就不同目錄下多文件了啊,那沒啥意思。咱上多層級目錄多源文件的。


目錄結構

代碼

  • Printer.h
#pragma once
class Printer{
public:
    void print();
    Printer();
    ~Printer();
};
  • Printer.cpp
#include "Printer.h"
#include <iostream>
using namespace std;
void Printer::print(){
    cout<<"Hello World"<<endl;
}

Printer::Printer() {
    cout<<"Printer Object Constructed"<<endl;
 }

 Printer::~Printer(){
     cout<<"Printer Object Destructed"<<endl;
 }
  • 'main.cpp'
#include "Lib/Printer.h"
int main(){
    Printer* printer = new Printer();
    printer->print();
    delete printer;
    return 0;
}

生成項目

編寫CMakeLists

每一個包含源文件的目錄中都要編寫CMakeLists.txt

  • CMakeLists.txt
    根目錄中的CMakeLists.txt,一般程序入口(main函數)在此。
# 使用CMake Tools插件(可選,如果這個項目去到一個沒有這個插件的機器也同樣可以生成項目)
include(CMakeToolsHelpers OPTIONAL)

# CMake 最低版本號要求
cmake_minimum_required(VERSION 2.8)

# 項目名稱
project(CMakeTest)

# 查找當前目錄下的所有源文件
# 并將名稱保存到 DIR_ROOT_SRCS變量
aux_source_directory(. DIR_ROOT_SRCS)

# 添加 Lib子目錄
add_subdirectory(Lib)

# 指定生成目標
add_executable(CMakeTest main.cpp ${DIR_ROOT_SRCS})

# 添加鏈接庫
target_link_libraries(CMakeTest PrinterLib)
  • Lib/CMakeLists.txt
    子目錄中的CMakeLists.txt,一般將子目錄中的源文件編譯為靜態鏈接庫。
include(CMakeToolsHelpers OPTIONAL)

cmake_minimum_required(VERSION 2.8)

aux_source_directory(. DIR_LIB_SRCS)

# 生成鏈接庫
add_library(PrinterLib ${DIR_LIB_SRCS})

Build

完成上面步驟后,就可以Build了,如果你安裝了vector-of-bool.cmake-tools插件,VSCode左下角的底邊欄會有Build按鈕。

Build Button

點擊Build后,選擇Debug(為了下一步演示調試,若不調試就Release
Build Setting

輸出框會不停往出噴東西,只要最后輸出了[vscode] cmake exited with return code 0,就說明Build成功。
Build Output

目錄結構

目錄結構

新增加的build文件夾是vector-of-bool.cmake-tools插件干的,它做的很好,如果我們手動cmake - make,那些生成文件會跑的到處都是。
其中build/CMakeTests.exe就是我們生成的可執行程序。


調試

調試設置

文件 - 首選項 - 設置
CMake Tools configuration中找到cmake.debugConfig,生成設置:

"cmake.debugConfig": {
        "miDebuggerPath": "gdb.exe",    // Windows 下指定gdb路徑(已添加到PATH)
        "externalConsole": true,    // 使用外部控制臺
        "stopAtEntry": false    // 在起點處停頓(噢!在這停頓!)
    },

Start Debugging

藏起來的Debug按鈕

剛Build完你可能看不到這兩個按鈕:


調試按鈕

其實他們藏起來了... 這應該是個Bug,我已經反饋給作者了。

重啟VSCode后他們就會出現,或者直接點那兩個藏起來的按鈕(還有這種操作?!):先點右邊選擇調試目標,再點左邊開始調試。

合影留念

完結撒花


結語

Code Everywhere, Build Everywhere.
這樣的搭配是不是很爽呢?除了MinGW是Windows特有的矯情外。其余的在任何平臺都是一樣的。雖說現在VSCode和上面的大部分插件都運行的不太穩定,但是我還是很喜歡這種組合進行跨平臺的輕量級開發的。


FAQ

  • Q: VSCode或編譯器找不到頭文件?

    A: 如果VSCode用綠色波浪線給你劃出那些找不到源的代碼時,將鼠標停留在波浪線上,然后會出現一個小 燈泡。點“Add include path to settings.”。然后它會自動幫你建立一個名為“c_cpp_properties.json”的文件。
"name": "Mac",
"includePath": [
    "${workspaceRoot}",
    "/usr/include",
    "/usr/local/include"
],

你會在其中找到類似上述代碼塊的地方,根據“name”后面所描述的系統,在其下的“includePath”中手動添加頭文件目錄。JSON語法。

  • Q: 為什么路徑動不動就寫成${fileDirname}/${fileBasenameNoExtension}.out?

    A: 這樣做的好處就是可以在同一配置下進行多個單文件的編譯開發,不用每次生成和調試的時候都去寫配置文件。使用場景嘛,主要就是寫寫算法題之類的。

    我寫算法題時的目錄結構

    .out后綴名就是自己瞎起的。不同平臺的可執行后綴名都不一樣,這樣寫就跟誰都不沾邊了...

  • Q: 如果我不用vector-of-bool.cmake-tools插件,要如何Build?

    A: 寫完CMakeLists.txt后,打開VSCode中自帶的終端(點擊底邊欄的輸出按鈕)

輸出按鈕

終端

鍵入:cmake .會生成系統對應的項目(如果你是Windows并安裝了Visual Studio,他就會生成VS項目)。
若想生成MinGW Makefiles則鍵入cmake -G "MinGW Makefiles" .(注意區分大小寫),之后會為你生成makefiles,然后再鍵入make(若沒制作前面所提到的mingw32-make.exe的名為make.exe的副本,則鍵入mingw32-make),最終生成可執行文件。

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容