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()); } 

链接语法的节点扩展将会很酷:)