node.js的v8扩展 – 无法将FunctionTemplate设置为目标
我刚刚开始通过v8扩展(根据Node.JS文档和v8 API文档的说明 )编写一个绑定到C库(准确地说是链接语法)。
我的问题是,我得到以下的生成错误:
/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
…当试图build立下面的代码:
#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 ++编码器,所以很可能这个错误正在我的脸上。 唉,我不知所措。
Set
方法需要一个Handle<Value>
,但是你传递一个FunctionTemplate,它不能自动转换。 您需要在模板上使用GetFunction来获取值的句柄。
target->Set(String::New("parse"), FunctionTemplate::New(v8parse)->GetFunction());
然而,这是一个macros,所以我会build议这样做:
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); }
extern "C" { NODE_MODULE(yourmodulefilename, init); }
在文件底部让节点知道这是一个加载模块。
您可能需要在函数模板上调用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()); }
链接语法的节点扩展将会很酷:)