javascript — Получение & quot; Ошибка поиска символа & quot; при вызове библиотеки C из C ++ (Node.js Addon)

Я работаю над аддоном Node.js, который должен обернуть объекты из C библиотека в C ++, чтобы к ним можно было получить доступ из клиентского JavaScript (написанного на CoffeeScript).

Модуль C ++ компилируется, но когда я пытаюсь запустить его через JavaScript Node.js, библиотека C не вызывается с symbol lookup error что у меня проблемы с отладкой.

Ошибка ниже:
node: symbol lookup error: /var/lib/cloud9/ledscape-wrapper/wrapper/build/Release/wrapper.node: undefined symbol: ledscape_init

wrapper.node это скомпилированный пакет, ledscape_init это функция в библиотеке, которую я пытаюсь вызвать.

Я попытался отследить код и найти соответствующие фрагменты в нескольких файлах. Я отбросил строки, которые я посчитал посторонними.

# "AllFade.coffee"@ledscape = require "./ledscape.js"@frames[1] = @ledscape.LedscapeInit()
# "Ledscape.coffee"wrapper = require "./build/Release/wrapper"module.exports = wrapper

wrapper.cc

extern "C" {
#include <ledscape.h>
}
#include <node.h>
#include <v8.h>
#include <node_object_wrap.h>
#include "LedscapeWrapper.h"
Handle<Value> LedscapeInit(const Arguments& args) {
HandleScope scope;
return scope.Close(LedscapeWrapper::NewInstance(args));
}

void InitAll(Handle<Object> exports, Handle<Object> module) {
LedscapeWrapper::Init(module);
NODE_SET_METHOD(exports, "LedscapeInit", LedscapeInit);
}

NODE_MODULE(wrapper, InitAll)

LedscapeWrapper.h

extern "C" {
#include <ledscape.h>
}
#include <node.h>
#include <node_object_wrap.h>
using namespace v8;

class LedscapeWrapper : public node::ObjectWrap {
public:
static void Init(v8::Handle<v8::Object> exports);
static Handle<Value> NewInstance(const Arguments& args);
inline ledscape_t* value() const { return value_; }
private:
explicit LedscapeWrapper(ledscape_t* value = ledscape_init(1));
~LedscapeWrapper();
static Handle<Value> New(const Arguments& args);
static v8::Persistent<v8::Function> constructor;
ledscape_t* value_;
};

LedscapeWrapper.cpp

extern "C" {
#include <ledscape.h>
}
#include <node.h>
#include "LedscapeWrapper.h"using namespace v8;

void LedscapeWrapper::Init(Handle<Object> exports) {
Local<FunctionTemplate> tpl = FunctionTemplate::New(New);
tpl->SetClassName(String::NewSymbol("LedscapeWrapper"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
constructor = Persistent<Function>::New(tpl->GetFunction());
exports->Set(String::NewSymbol("LedscapeWrapper"), constructor);
}

Handle<Value> LedscapeWrapper::New(const Arguments& args) {
HandleScope scope;
if(args.IsConstructCall()) {
ledscape_t* ledscape = ledscape_init(args[0]->NumberValue());
LedscapeWrapper* obj = new LedscapeWrapper(ledscape);
obj->Wrap(args.This());
return args.This();
}
else {
const int argc = 1;
Local<Value> argv[argc] = { args[0] };
return scope.Close(constructor->NewInstance(argc, argv));
}
}

Handle<Value> LedscapeWrapper::NewInstance(const Arguments& args) {
HandleScope scope;
const int argc = 1;
Handle<Value> argv[argc] = { args[0] };
Local<Object> instance = constructor->NewInstance(argc, argv);
return scope.Close(instance);
}

binding.gyp

{
"targets": [{
"target_name": "wrapper",
"sources": ["wrapper.cc","LedscapeWrapper.cpp","LedscapeFrameWrapper.cpp"],
'include_dirs': ['/opt/ledscape/'],
'link_settings': {  'library_dirs': ['/opt/ledscape']  },
}],
}

Я думаю, что проблема в одном из призывов к ledscape_init() внутри LedscapeWrapper.cpp, и что он не может найти библиотеку (ledscape.h), но я не в первую очередь разработчик C / C ++.

Я пытался заглянуть в nm инструмент, либо из GNU или Node, но он отказался исследовать .node файл, и я не нашел никаких указателей использования онлайн.

4

Решение

Задача ещё не решена.

Другие решения