【问题标题】:Problem requiring native c++ addon from electron需要来自电子的本机 C++ 插件的问题
【发布时间】:2019-01-09 11:47:05
【问题描述】:

当我需要一个来自 Electron 的 Native Addon C++ 并且可以在 Node.js 中正常工作时出错

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

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

dyld:惰性符号绑定失败:找不到符号:__ZN2v816FunctionTemplate3EPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorENS_14SideEffectTypeE 引用自:/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 预期在:平面命名空间

我可以看到,当我从 Electron 应用程序调用时,问题就出现了

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());
}

我的 Electron 版本是 3.0.10 我的南版 2.12.1 我的绑定版本 1.3.1

有人有什么建议吗?

【问题讨论】:

  • 如果这是您的第一个插件,我建议您考虑使用 N-API 或基于 N-API 构建的 C++ node-addon-api。我正在将旧 Nan 代码转换为 node-addon-api,这是一个巨大的改进。
  • 顺便说一句,我在下面回答只是因为当我第一次制作插件时,这是一项孤独的努力。很难找到反映现实世界场景的帮助和示例。另一个建议,尽管它可能有点像喝大海——微软的 vscode 是一个电子应用程序。我敢打赌,代码库中有一些插件 - 如果您无法以其他方式找到答案,这些插件可能会提供线索。

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


【解决方案1】:

我不肯定这是问题所在,但由于函数模板缺少您的 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”,所以这是一个猜测。

【讨论】:

  • 感谢您的帮助。我会研究你的解决方案,我会报告你的结果。
  • 感谢您的建议。尝试您的解决方案后,出现以下错误:“调用没有对象参数的非静态成员函数”在 NODE_MODULE(DASNetAddon, CoreWorkerWrapper::Init) 你有什么想法吗?请随意忽略这个问题,如果它困扰你。
  • 不知道;我会检查 Init 函数签名和 New 函数签名。但是如果没有代码,我真的很难猜到。它根本不打扰我。我只是希望我能帮忙。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
相关资源
最近更新 更多