需要电子提供本地C ++插件的问题

时间:2019-01-09 11:47:05

标签: node.js electron node.js-addon

当我需要从Node.js的鳍片上获取电子的本机Addon C ++时出错

最近,我为节点开发了我的第一个本机C ++插件,该插件可与我的节点项目(节点版本10.15.0)配合使用 该插件是使用XCode构建的,该项目是使用CMake生成的。

当我从Electron应用程序中使用相同的本机C ++插件时,出现以下错误。

dyld:懒惰的符号绑定失败:找不到符号:__ZN2v816 FunctionTemplate 3 New EPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorfect_14   引用自:/Users/vicentvidal/Documents/Desarrollo/DASNet2/dasaudio/build/DASNetAddon.node   预期于:平面名称空间 dyld:未找到符号:__ZN2v816FunctionTemplate3NewEPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorENS_14SideEffectTypeE   引用自:/Users/vicentvidal/Documents/Desarrollo/DASNet2/dasaudio/build/DASNetAddon.node   预期用于:平面名称空间

正如我所见,问题仅在我从电子应用程序拨打电话时出现

const addon = require('bindings')('DASNetAddon');

调用以下C ++代码

static NAN_MODULE_INIT(Init) {
    v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
    tpl->SetClassName(Nan::New("StreamingWorker").ToLocalChecked());
    tpl->InstanceTemplate()->SetInternalFieldCount(2);

    SetPrototypeMethod(tpl, "sendToAddon", sendToAddon);

    constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
    Nan::Set(target, Nan::New("StreamingWorker").ToLocalChecked(),
        Nan::GetFunction(tpl).ToLocalChecked());
}

我的电子版本为3.0.10 我的楠2.12.1版本 我的绑定版本1.3.1

有人有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我不是很肯定这是问题所在,但可能是因为函数模板缺少您的C ++类名,所以命名空间来自其他地方。这是我的Nan Init()函数之一。 // Prepare constructor template之后的行使New参数具有类名称空间。

void Metadata::Init(v8::Local<v8::Object> exports) {
  Nan::HandleScope scope;

  // Prepare constructor template
  v8::Local<v8::FunctionTemplate> ctor = Nan::New<v8::FunctionTemplate>(Metadata::New);
  constructor.Reset(ctor);
  ctor->InstanceTemplate()->SetInternalFieldCount(2);
  ctor->SetClassName(Nan::New("Metadata").ToLocalChecked());


  // Prototype
  Nan::SetPrototypeMethod(ctor, "copy", Metadata::copy);

  Nan::Set(exports, Nan::New("Metadata").ToLocalChecked(), ctor->GetFunction());
}

我没有尝试在Electron环境中或在Mac上运行/加载,所以我只能说这在Linux上可以正常工作。但是因为您的错误消息涉及“ FunctionTemplate3New”,所以这是一个猜测。