nodejs c++插件开发(一) -- 使用vscode 搭建一个c++项目,并调试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++插件开发非常的简单.参见文档
安装都很简单不会有什么问题.参见相关的文档或者度娘就好.这里就不赘述了.

目录结构

目录结构
  1. .vscode目录是vscode编辑器的目录一些配置都是在该目录下.
  1. build目录是编译c++之后自动生成的目录这里目前不用太关心它.
  2. node-src目录是用来放置js文件的.因为插件总需要一个宿主来启动的.
  3. src目录放置的c++代码.

这个项目我尽量弄的非常简单大家也都会看的非常明白:
main.js主要的目的是去相对的目录找到addon这个插件(由下面的cc编译而来).并且运行插件中的hello函数.

//main.js 宿主程序js
const addon = require('../build/Debug/addon');
console.log(addon.hello()); //调用插件的hello函数.

hello.cc会被编译成addon.后面会详细说明.

// 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();
  //这句话相当于js里面的return. 相关见node文档.
  args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));
  int haha = 500; //这块是为了调试清楚而写的代码
  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了.
现在我们讲解下如何用node-gyp来生成addon这个名字的插件.

编译hello.cc获得addon

参见文档文档里有详细的说明和所有插件编写的内容.我们这里就不详细说明了.
打开控制台.vscode自己就带了终端的内置.我们使用这个就好. [ctrl + `]快捷键就可以call出来终端.
众所周知编译c++需要makefile. gyp这个工具可以生成makefile.我们需要创建一个binding.gyp文件(实际上是一个json格式的文件).

{ 
  "targets": [ 
    { 
      "target_name": "addon",  //这里就是插件的名字
      "sources": [ "src/hello.cc" ]  //cc文件的路径,如果多cc需要继续往后加.
    }
  ]
}

有了这个gyp文件.我们就可以使用gyp命令行来编译生成插件了.

node-gyp configure --debug
node-gyp build

为啥用debug....因为release的话断点就呵呵了.我们先debug.

Paste_Image.png

这块会自己build文件夹创建好.然后目录也ok.最后我们会找到 addon.node文件.实际上就是个动态库.只是后缀被改成node而已.

调试

下面来说一下vscode的调试.
cpptool插件提供了一个lauch.json文件用来调试代码.主要就是配置这个来支持调试的功能.直接上配置.

{
  "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}", //进程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分两个部分.对应vscode的两个debug选项.

vscode debug的地方

如果你没有这两个选项.需要你点击 添加配置.或者 那个边上的设置按钮.

设置配置

设置完成后就会生成如同上面所贴的json.

Paste_Image.png

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

先看C++ Launch的部分.
由于我们开发的插件是需要node来加载运行的.所以vm(虚拟机)是node.自然是要node启动. 然后参数 自然是我们的js代码.
配置完成. 我们就可以F5运行了.

运行 C++ Launch的部分.

Paste_Image.png

好了运行的很完美. 下面我们来看最常用的 attach.

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

我们需要把js 稍微的修改一下.不然还没等我们attach呢.程序就跑完了结束了.

//main.js 开个定时器.一直调用插件的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指令看一下相当的进程.

Paste_Image.png

5228就是这个进程.

Paste_Image.png

换成Attach方式. Lauch.json 这时候需要指向我们创建的插件.

Paste_Image.png

processID就可以修改成 5288了. 直接F5 就可以attach上了.不过这样有点麻烦.老修改json太low. 所以用pickProcess这个commond命令 就非常的方便.
不修改成5288. 而是变成${command:pickProcess} 我们直接F5运行.

Paste_Image.png

弹出的窗口会列出来所有的系统的进程.我们的进程是node所以输入node. 会发现5288.点这个. 就ok了.

Paste_Image.png

运行的很完美.
如果过程中有问题.欢迎加入我的QQ群(20906995)讨论.
同时欢迎打赏哦.~ 嘻嘻~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容