C++文件怎么转.node文件提供给前端使用

Node.js文档地址

1.创建一个hello.cc的源代码文件

这里是在根目录下创建的hello.cc文件,其它目录都可以,只需要与下面的 binding.gyp 文件配置的sources数组里面的内容对应就行)

#include <node.h>
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();
  args.GetReturnValue().Set(String::NewFromUtf8(
      isolate, "world").ToLocalChecked());
}

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

NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)

}  // namespace demo
复制代码

2.在根目录下创建binding.gyp文件

编写源代码后,必须将其编译为二进制 addon.node 文件。 为此,请在项目的顶层创建名为 binding.gyp 的文件,使用类似 JSON 的格式描述模块的构建配置。 该文件由 node-gyp 使用,这是一个专门为编译 Node.js 插件而编写的工具

{
  "targets": [
    {
      "target_name": "addon", #最终生成的.node文件名
      "sources": [ "hello.cc" ] #需要编译的cc文件
    }
  ]
}
复制代码

复制的时候请把中文注释去掉,不然后面编译要报错。

3.安装node-gyp

node-gyp 实用工具的一个版本作为 npm 的一部分与 Node.js 捆绑和分发。 此版本不直接提供给开发人员使用,仅旨在支持使用 npm install 命令编译和安装插件的能力。 希望直接使用 node-gyp 的开发人员需要先安装

npm install -g node-gyp
复制代码

4.生成项目的构建文件

创建 binding.gyp 文件后,使用

node-gyp configure
复制代码

为当前平台生成适当的项目构建文件,这将在 build/ 目录中生成 Makefile(在 Unix 平台上)或 vcxproj 文件(在 Windows 上)

5.生成.node文件并使用

最后,调用

node-gyp build
复制代码

命令生成编译后的 addon.node 文件。 这将被放入 build/Release/ 目录.

当使用 npm install 安装 Node.js 插件时,npm 使用它自己的 node-gyp 捆绑版本来执行相同的一组操作,按需为用户平台生成插件的编译版本(不懂这句话啥意思)

构建完成后,可以通过将 require()指向构建的 addon.node 模块在 Node.js 中使用二进制插件,我们新建一个hello.js文件来进行测试

// hello.js
const addon = require('./build/Release/addon');

console.log(addon.hello());
// 打印: 'world'
复制代码

6. 使用绑定包来加载模块

在Node的插件历史过程中,插件最终会在各种不同的位置进行编译,具体取决于使用的构建工具和Node版本。更糟糕的是,现在gyp构建工具可以生成ReleaseDebug构建,每个构建都构建在不同的位置。

可以使用绑定bindings包来加载已经编译个模块,用来帮助你加载你自己的模块的帮助模块此模块检查将在其中构建本机插件的 所有 可能位置,并返回第一个成功加载的位置

安装

npm install --save bindings
复制代码

也可以添加它到package.json文件中dependencies

安装完成后,我们可以通过这样的方式在hello.js进行使用

require()为当前节点版本,平台和体系结构提供正确的绑定文件非常简单

const addon = require('bindings')('hello.node')

console.log(addon.hello());
// 打印: 'world'
复制代码

  # C++源文件
  "sources": [
    "./src/greeting.cpp",
    "./src/index.cpp"
  ],
  
  # C++ 头文件目录
  "include_dirs": [
    "<!@(node -p \"require('node-addon-api').include\")"
  ],
 
  # 预编译宏
  'defines': [ 
    'NAPI_DISABLE_CPP_EXCEPTIONS'
  ],
  # 静态库
  'libraries':[]
}
复制代码

おすすめ

転載: juejin.im/post/7040013430979461156