我刚刚开始通过v8扩展名编写绑定到C库(确切地说是链接语法)(遵循Node.JS docs和v8 API docs上的说明。)< / p>
我的问题是我收到以下构建错误:
/usr/include/v8.h: In constructor âv8::Handle<T>::Handle(v8::Handle<S>) [with S = v8::FunctionTemplate, T = v8::Value]â:
node.cc:85:68: instantiated from here
/usr/include/v8.h:195:5: error: cannot convert âv8::FunctionTemplate*â to âv8::Value* volatileâ in assignment
...在尝试构建以下代码时:
#include <v8.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include "link-includes.h"
using namespace v8;
Dictionary dict;
Parse_Options opts;
static Handle<Value> v8parse(const Arguments& args)
{
/* snip */
}
extern "C" void init (Handle<Object> target)
{
HandleScope scope;
target->Set(String::New("parse"), FunctionTemplate::New(v8parse));
setlocale(LC_ALL, "");
opts = parse_options_create();
dict = dictionary_create_lang("en");
}
我觉得好像我已经按照上面链接的说明操作,并按照他们链接到的示例模式,但是我得到了上述错误。不是那里最敏捷的C ++编码器,所以很可能错误就是盯着我看。唉,我不知所措。
答案 0 :(得分:2)
您可能需要在函数模板上调用GetFunction()。我只涉及到节点的c ++扩展,但似乎我见过的大多数代码示例都是这样的:
static Persistent<FunctionTemplate> s_ct;
static void Init(Handle<Object> target)
{
HandleScope scope;
Local<FunctionTemplate> t = FunctionTemplate::New(New);
s_ct = Persistent<FunctionTemplate>::New(t);
s_ct->InstanceTemplate()->SetInternalFieldCount(1);
s_ct->SetClassName(String::NewSymbol("MyClass"));
NODE_SET_PROTOTYPE_METHOD(s_ct, "someMethod", MyClass::SomeMethod);
target->Set(String::NewSymbol("MyClass"),
s_ct->GetFunction());
}
链接语法的节点扩展将很酷:)
答案 1 :(得分:2)
Set
方法需要Handle<Value>
,但您传递的是FunctionTemplate,它无法自动转换。您需要在模板上使用GetFunction来获取它的值句柄。
target->Set(String::New("parse"), FunctionTemplate::New(v8parse)->GetFunction());
但是,有一个宏,所以我建议这样做:
NODE_SET_METHOD(target, "parse", v8parse);
我发现这篇博文/示例代码在我玩这个东西时非常有用。 https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/
我不是100%肯定,因为你发布的nodejs文档中没有提到它,但我认为你还需要在文件底部有一个extern "C" { NODE_MODULE(yourmodulefilename, init); }
让节点知道这是一个加载模块。