gpt4 book ai didi

javascript - 从 C++(Node.js 插件)调用 C 库时出现 "Symbol Lookup Error"

转载 作者:行者123 更新时间:2023-12-05 00:33:20 25 4
gpt4 key购买 nike

我正在开发一个需要从 C library 包装对象的 Node.js 插件。在 C++ 中,因此可以从客户端 JavaScript(用 CoffeeScript 编写)访问它们。

C++ 模块可以编译,但是当我尝试通过 Node.js JavaScript 运行它时,无法使用 symbol lookup error 调用 C 库我在调试时遇到问题。

错误如下: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

包装器.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);
}

绑定(bind).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文件,我没有在网上找到任何使用指南。

最佳答案

发生此问题的原因是,实际程序找不到动态库(.so 文件)我建议创建一个动态库并将其添加到当前查找路径中,以便/usr/lib 在 linux

关于javascript - 从 C++(Node.js 插件)调用 C 库时出现 "Symbol Lookup Error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com