Проблема, требующая нативный аддон с ++ от электрона - PullRequest
0 голосов
/ 09 января 2019

Ошибка, когда мне требуется Native Addon C ++ от электрона, который работает с плавником из Node.js

Недавно я разработал свой первый собственный C ++ Addon для узла, который отлично работает с моим проектом узла (версия узла 10.15.0) Аддон был построен с использованием XCode, проект которого генерировался с использованием CMake.

У меня возникает следующая ошибка, когда я использую то же самое собственное дополнение C ++ из моего приложения Electron.

dyld: ленивая привязка символа не выполнена: символ не найден: __ZN2v816 FunctionTemplate 3 Новый EPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalISINE_SignEEEEEEEEEIEEEIEBeE_eE Ссылка на: /Users/vicentvidal/Documents/Desarrollo/DASNet2/dasaudio/build/DASNetAddon.node Ожидается в: плоское пространство имен Dyld: символ не найден Ссылка на: /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());
}

My Electron версия 3.0.10 Моя Нэн версия 2.12.1 Мои привязки версия 1.3.1

У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 09 января 2019

Я не уверен, что это проблема, но возможно, что из-за того, что в шаблоне функции отсутствует имя вашего класса 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», это предположение.

...