为nodejs编写c++插件

1. 首先,你需要安装Node.js。请前往 Node.js 下载并安装适合你操作系统的版本。

也可以选择使用nvm(Releases · coreybutler/nvm-windows · GitHub)来安装;

使用nvm的情况下可以方便的控制node的版本和位数(32位的c++扩展只能使用32位的node.exe来加载,64位的c++扩展只能使用64位的node.exe来加载)

1.1 安装64位的node

nvm install 16.14.2 64

1.2 安装32位的node

nvm install 16.14.2 32

2. 安装完Node.js之后,你需要安装node-gyp。node-gyp是一个Node.js模块,用于构建Node.js插件和原生模块。

npm install -g node-gyp

3. 编写binding.gyp的配置文件

{
  "targets": [
    {
      "target_name": "addon",
      "sources": [ "addon.cpp" ]
    }
  ]
}

4. 新建一个空的addon.cpp文件,先不用写代码,先生成vs工程

5. 生成vs工程

node-gyp configure

5.1 此时在build文件夹下会生成相应的vs工程

5.2 通常我们的代码都比较复杂,需要修改vs工程的各种属性,可以在这一步做

 5.3 编写代码

// addon.cc
#include <node.h>

namespace demo {

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

// This is the implementation of the "add" method
// Input arguments are passed using the
// const FunctionCallbackInfo<Value>& args struct
void Add(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();

  // Check the number of arguments passed.
  if (args.Length() < 2) {
    // Throw an Error that is passed back to JavaScript
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate,
                            "Wrong number of arguments").ToLocalChecked()));
    return;
  }

  // Check the argument types
  if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate,
                            "Wrong arguments").ToLocalChecked()));
    return;
  }

  // Perform the operation
  double value =
      args[0].As<Number>()->Value() + args[1].As<Number>()->Value();
  Local<Number> num = Number::New(isolate, value);

  // Set the return value (using the passed in
  // FunctionCallbackInfo<Value>&)
  args.GetReturnValue().Set(num);
}

void Init(Local<Object> exports) {
  NODE_SET_METHOD(exports, "add", Add);
}

NODE_MODULE(NODE_GYP_MODULE_NAME, Init)

}  // namespace demo

6. 编译,用node-gyp编译而不是用vs编译(node-gyp内部会使用vs编译,然后再打成一个node包)

node-gyp build

7. 最终会生成相应的*.node包

 8. 写一个test.js来测试这个addon.node包

9. 输出结果如下:

10. 可能会出现下面的问题,原因是扩展的位数和node.exe的位数对不上,使用nvm use 16.12.4 32来切换node的位数就可以了

安装多个版本的node

安装多个版本的node需要借助nvm来管理

1. 先安装nvm

2. 再使用nvm install 16.14.2 32来安装32位的node

3. 再使用nvm install 16.14.2 64 来安装64位的node

4. 使用nvm use 16.14.2 32将版本切换到32位,这时你的控制台可能会输出乱码

我们使用chcp 65001 将控制台的编码设置为utf-8;

再次输入nvm use 16.14.2 32 就可以看到正确的错误信息了

如果我们编译的c++插件是给electron用的,那么需要注意abi一致性

1. 先安装node

2. 使用npm安装electron

npm install electron --registry=https://registry.npm.taobao.org

electron其实就是某一个特殊版本的node,关系如下

NODE_MODULE_VERSION对照表-CSDN博客

3. 安装node-gyp

4. 使用node-gyp编译的时候指定electron的版本

node-gyp configure--target=10.1.7 --arch=x64 --dist-url=https://electronjs.org/headers

node-gyp build

关于全局安装和局部安装

1. npm install 没有使用使用-g 时,是局部安装,依赖当前文件夹中的package.json文件

2. 每一个项目都有自己的electron和node, 位于node_modules文件夹中

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值