【发布时间】:2019-01-09 11:47:05
【问题描述】:
当我需要一个来自 Electron 的 Native Addon C++ 并且可以在 Node.js 中正常工作时出错
最近我为节点开发了我的第一个原生 C++ 插件,它适用于我的节点项目(节点版本 10.15.0) 该插件是使用 XCode 构建的,该项目是使用 CMake 生成的。
当我从我的 Electron 应用程序中使用相同的本机 C++ 插件时,我遇到了以下错误。
dyld:惰性符号绑定失败:找不到符号:__ZN2v816FunctionTemplate3新EPNS_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