nodejs c++插件開發(fā)(一) -- 使用vscode 搭建一個c++項目,并調(diào)試c++代碼

原料:

  1. Visual Studio Code (后面簡稱vscode) Version 1.11.2 (1.11.2)
  1. vscode插件cpptool(用來支持c++的插件) Version 0.10.5
  2. nodejs(不知道這個就不用看本文了 2333) Version 7.9.0
  3. node-gyp(node插件的編譯工具) Version 3.6.0

Visual Studio Code是本人目前非常喜歡的微軟編輯器.vscode更像一個精簡的Visual Studio.并且有插件商店.非常小巧靈活的編輯器.
nodejsc++插件開發(fā)非常的簡單.參見文檔
安裝都很簡單不會有什么問題.參見相關(guān)的文檔或者度娘就好.這里就不贅述了.

目錄結(jié)構(gòu)

目錄結(jié)構(gòu)
  1. .vscode目錄是vscode編輯器的目錄一些配置都是在該目錄下.
  1. build目錄是編譯c++之后自動生成的目錄這里目前不用太關(guān)心它.
  2. node-src目錄是用來放置js文件的.因為插件總需要一個宿主來啟動的.
  3. src目錄放置的c++代碼.

這個項目我盡量弄的非常簡單大家也都會看的非常明白:
main.js主要的目的是去相對的目錄找到addon這個插件(由下面的cc編譯而來).并且運行插件中的hello函數(shù).

//main.js 宿主程序js
const addon = require('../build/Debug/addon');
console.log(addon.hello()); //調(diào)用插件的hello函數(shù).

hello.cc會被編譯成addon.后面會詳細(xì)說明.

// hello.cc 插件程序c++
#include <node.h>
#include <iostream>

using namespace std;

namespace demo
{

using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;

void Method(const FunctionCallbackInfo<Value> &args)
{
  Isolate *isolate = args.GetIsolate();
  //這句話相當(dāng)于js里面的return. 相關(guān)見node文檔.
  args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));
  int haha = 500; //這塊是為了調(diào)試清楚而寫的代碼
  haha ++;
  haha = 0;
  cout << haha << endl;
}

void init(Local<Object> exports)
{
  NODE_SET_METHOD(exports, "hello", Method);
}

NODE_MODULE(addon, init)

} // namespace demo

ok看到這里我們目錄和代碼就全部ok了.
現(xiàn)在我們講解下如何用node-gyp來生成addon這個名字的插件.

編譯hello.cc獲得addon

參見文檔文檔里有詳細(xì)的說明和所有插件編寫的內(nèi)容.我們這里就不詳細(xì)說明了.
打開控制臺.vscode自己就帶了終端的內(nèi)置.我們使用這個就好. [ctrl + `]快捷鍵就可以call出來終端.
眾所周知編譯c++需要makefile. gyp這個工具可以生成makefile.我們需要創(chuàng)建一個binding.gyp文件(實際上是一個json格式的文件).

{ 
  "targets": [ 
    { 
      "target_name": "addon",  //這里就是插件的名字
      "sources": [ "src/hello.cc" ]  //cc文件的路徑,如果多cc需要繼續(xù)往后加.
    }
  ]
}

有了這個gyp文件.我們就可以使用gyp命令行來編譯生成插件了.

node-gyp configure --debug
node-gyp build

為啥用debug....因為release的話斷點就呵呵了.我們先debug.

Paste_Image.png

這塊會自己build文件夾創(chuàng)建好.然后目錄也ok.最后我們會找到 addon.node文件.實際上就是個動態(tài)庫.只是后綴被改成node而已.

調(diào)試

下面來說一下vscode的調(diào)試.
cpptool插件提供了一個lauch.json文件用來調(diào)試代碼.主要就是配置這個來支持調(diào)試的功能.直接上配置.

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C++ Launch",
      "type": "cppdbg",
      "request": "launch",
      "program": "/usr/local/bin/node",  //node vm地址
      "args": ["node-src/main.js"], //宿主js地址
      "stopAtEntry": false,
      "cwd": "${workspaceRoot}",
      "environment": [],
      "externalConsole": true,
      "linux": {
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ]
      },
      "osx": {
        "MIMode": "lldb"
      },
      "windows": {
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ]
      }
    },
    {
      "name": "C++ Attach",
      "type": "cppdbg",
      "request": "attach",
      "program": "${workspaceRoot}/build/Debug/addon.node", //插件地址
      "processId": "${command:pickProcess}", //進(jìn)程id
      "linux": {
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ]
      },
      "osx": {
        "MIMode": "lldb"
      },
      "windows": {
        "MIMode": "gdb",
        "setupCommands": [
          {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
          }
        ]
      }
    }
  ]
}

這個json分兩個部分.對應(yīng)vscode的兩個debug選項.

vscode debug的地方

如果你沒有這兩個選項.需要你點擊 添加配置.或者 那個邊上的設(shè)置按鈕.

設(shè)置配置

設(shè)置完成后就會生成如同上面所貼的json.

Paste_Image.png

launch.json說明 -> C++ Launch的部分.

先看C++ Launch的部分.
由于我們開發(fā)的插件是需要node來加載運行的.所以vm(虛擬機(jī))是node.自然是要node啟動. 然后參數(shù) 自然是我們的js代碼.
配置完成. 我們就可以F5運行了.

運行 C++ Launch的部分.

Paste_Image.png

好了運行的很完美. 下面我們來看最常用的 attach.

launch.json說明 -> C++ Attach的部分.

我們需要把js 稍微的修改一下.不然還沒等我們attach呢.程序就跑完了結(jié)束了.

//main.js 開個定時器.一直調(diào)用插件的hello方法.
const addon = require('../build/Debug/addon');
setInterval(
  ()=>{
    console.log(addon.hello());
  },
  1000
);

我們先把node跑起來.不停的輸出World.

node node-src/main.js
Paste_Image.png

這個bash我們留著. 點+號按鈕新建一個bash.用ps指令看一下相當(dāng)?shù)倪M(jìn)程.

Paste_Image.png

5228就是這個進(jìn)程.

Paste_Image.png

換成Attach方式. Lauch.json 這時候需要指向我們創(chuàng)建的插件.

Paste_Image.png

processID就可以修改成 5288了. 直接F5 就可以attach上了.不過這樣有點麻煩.老修改json太low. 所以用pickProcess這個commond命令 就非常的方便.
不修改成5288. 而是變成${command:pickProcess} 我們直接F5運行.

Paste_Image.png

彈出的窗口會列出來所有的系統(tǒng)的進(jìn)程.我們的進(jìn)程是node所以輸入node. 會發(fā)現(xiàn)5288.點這個. 就ok了.

Paste_Image.png

運行的很完美.
如果過程中有問題.歡迎加入我的QQ群(20906995)討論.
同時歡迎打賞哦.~ 嘻嘻~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末读慎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椰于,更是在濱河造成了極大的恐慌捉邢,老刑警劉巖诱篷,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弃鸦,死亡現(xiàn)場離奇詭異口锭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)厘唾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門褥符,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抚垃,你說我怎么就攤上這事喷楣。” “怎么了鹤树?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵铣焊,是天一觀的道長。 經(jīng)常有香客問我罕伯,道長曲伊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任追他,我火速辦了婚禮熊昌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湿酸。我一直安慰自己,他們只是感情好灭美,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布推溃。 她就那樣靜靜地躺著,像睡著了一般届腐。 火紅的嫁衣襯著肌膚如雪铁坎。 梳的紋絲不亂的頭發(fā)上蜂奸,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音硬萍,去河邊找鬼扩所。 笑死,一個胖子當(dāng)著我的面吹牛朴乖,可吹牛的內(nèi)容都是我干的祖屏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼买羞,長吁一口氣:“原來是場噩夢啊……” “哼袁勺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畜普,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤期丰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吃挑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钝荡,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年舶衬,在試婚紗的時候發(fā)現(xiàn)自己被綠了埠通。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡约炎,死狀恐怖植阴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情圾浅,我是刑警寧澤掠手,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站狸捕,受9級特大地震影響喷鸽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灸拍,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一做祝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸡岗,春花似錦混槐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春悯嗓,著一層夾襖步出監(jiān)牢的瞬間件舵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工脯厨, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留铅祸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓合武,卻偏偏與公主長得像临梗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子眯杏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容