2011-08-11 7 views
1

私はちょうど、v8拡張機能(Node.JS docsv8 API docsの指示に従う)を介してCライブラリ(正確にはリンク文法)へのバインディングを書くことから始めています。 。私が続いてきたかのようにnode.jsのv8拡張機能 - ターゲットにFunctionTemplateを設定できません

#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"); 
} 

私は感じて次のコードをビルドしようとすると...

/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 

私の問題は、私は次のビルドエラーを取得していますということです上記のリンクの指示、リンク先の例のパターンに従っていますが、上記のエラーが発生します。そこでは最も鮮明なC++コーダーではないので、エラーは私を顔で見つめている可能性が非常に高いです。悲しいかな、私は迷っています。

答えて

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/

私はそれはあなたが投稿nodejsドキュメントに記載されていないので、100%わからないんだけど、私はあなたにもノードをできるように、ファイルの一番下にextern "C" { NODE_MODULE(yourmodulefilename, init); }が必要と思い、これがあることを知っていますロードするモジュール。

+0

素晴らしい、ありがとう!そのマクロを使用すると、これはもう少し自己文書化しているようです。まだC++のビルドに手が届かずにいますが、それでこの問題を乗り越えてしまいます。p – Stoive

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

リンク文法のためのノードの拡張子はクールになります:)

+0

ええ、以前はノードリンク文法のバインディングを作ってみたことは誰も驚いていました。結局github ...に終わるだろう。 – Stoive

関連する問題