nodejs c++插件開發(fā)(一) -- 使用vscode 搭建一個c++項(xiàng)目,并調(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文件的.因?yàn)椴寮傂枰粋€宿主來啟動的.
  3. src目錄放置的c++代碼.

這個項(xiàng)目我盡量弄的非常簡單大家也都會看的非常明白:
main.js主要的目的是去相對的目錄找到addon這個插件(由下面的cc編譯而來).并且運(yùn)行插件中的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文件(實(shí)際上是一個json格式的文件).

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

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

node-gyp configure --debug
node-gyp build

為啥用debug....因?yàn)閞elease的話斷點(diǎn)就呵呵了.我們先debug.

Paste_Image.png

這塊會自己build文件夾創(chuàng)建好.然后目錄也ok.最后我們會找到 addon.node文件.實(shí)際上就是個動態(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選項(xiàng).

vscode debug的地方

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

設(shè)置配置

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

Paste_Image.png

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

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

運(yùn)行 C++ Launch的部分.

Paste_Image.png

好了運(yùn)行的很完美. 下面我們來看最常用的 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我們留著. 點(diǎn)+號按鈕新建一個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上了.不過這樣有點(diǎn)麻煩.老修改json太low. 所以用pickProcess這個commond命令 就非常的方便.
不修改成5288. 而是變成${command:pickProcess} 我們直接F5運(yùn)行.

Paste_Image.png

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

Paste_Image.png

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

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

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