1

私は、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

...次のコードをビルドしようとした場合:

#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++コーダーではないので、エラーが私を正面から見つめている可能性が非常に高いです。悲しいかな、私は途方に暮れています。

4

2 に答える 2

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

リンク文法のノード拡張はかっこいいでしょう:)

于 2011-08-11T12:40:47.607 に答える
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); }、ファイルの下部に、これがロード用のモジュールであることをノードに知らせる必要があると思います.

于 2011-08-11T12:51:21.407 に答える