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,关系如下
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文件夹中