获得;符号查找错误“;从C+调用C库时+;(Node.js插件) 我正在研究一个No.js ADDO,需要从C++中包装这些对象,这样它们就可以从客户端JavaScript(用咖啡脚本编写)访问。 < > C++模块编译,但当我试图通过NoDE.jsJavaScript运行时,C库不能用“符号查找错误< /代码>调用,我有调试的问题。
错误如下:获得;符号查找错误“;从C+调用C库时+;(Node.js插件) 我正在研究一个No.js ADDO,需要从C++中包装这些对象,这样它们就可以从客户端JavaScript(用咖啡脚本编写)访问。 < > C++模块编译,但当我试图通过NoDE.jsJavaScript运行时,C库不能用“符号查找错误< /代码>调用,我有调试的问题。,javascript,c++,c,node.js,coffeescript,Javascript,C++,C,Node.js,Coffeescript,错误如下: node:符号查找错误:/var/lib/cloud9/ledscape wrapper/wrapper/build/Release/wrapper.node:未定义的符号:ledscape_init wrapper.node是已编译的包,ledscape\u init是我试图调用的库中的函数 我试图跟踪代码,并在多个文件中找到相关的代码片段。我放弃了我认为无关的台词 #“AllFade.咖啡” @ledscape=需要“/ledscape.js” @帧[1]=@ledscape.
node:符号查找错误:/var/lib/cloud9/ledscape wrapper/wrapper/build/Release/wrapper.node:未定义的符号:ledscape_init
wrapper.node
是已编译的包,ledscape\u init
是我试图调用的库中的函数
我试图跟踪代码,并在多个文件中找到相关的代码片段。我放弃了我认为无关的台词
#“AllFade.咖啡”
@ledscape=需要“/ledscape.js”
@帧[1]=@ledscape.LedscapeInit()
#“Ledscape.咖啡”
包装器=需要“/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.cpp中的ledscape\u init()
的调用之一,它无法找到库(),但我主要不是一名C/C++开发人员
我试图从GNU或Node查看
nm
工具,但它拒绝检查.Node
文件,并且我在网上找不到任何使用指针。您是否尝试使用“库”直接链接静态/动态库:[“/opt/ledscape/ledscape.a”]
(或ledscape.so
)没有使用链接设置
?@mscdex,而是没有任何扩展名为.a
或的文件。这些是自动生成的吗?(对不起,我对C/C++没有太多经验)您是先编译ledscape的吗?否则,您可能需要为ledscape创建一个gyp文件,然后将binding.gyp作为依赖项指向该文件。如果没有手动编译或设置依赖项gyp文件,ledscape不会链接到您的应用程序(静态或动态),因此缺少符号。@mscdex很抱歉延迟<代码>“库”:[“/opt/LED/LEDScape/LEDScape.o”
修复了第一个问题,但随后我得到了未定义的符号:pru_init
,它/opt/LED/LEDScape/LEDScape.h
包含在pru.h
中<代码>“库”:[“/opt/LED/LEDScape/LEDScape.o”,“/opt/LED/LEDScape/pru.o”]修复了该问题,但导致未定义的符号:prussdrv\u init
。有没有比包含更多依赖项更好的方法来修复这些问题?
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_;
};
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);
}
{
"targets": [{
"target_name": "wrapper",
"sources": ["wrapper.cc","LedscapeWrapper.cpp","LedscapeFrameWrapper.cpp"],
'include_dirs': ['/opt/ledscape/'],
'link_settings': { 'library_dirs': ['/opt/ledscape'] },
}],
}