C++弱者ながらC++でNodeモジュールを作る事にしたのでいろいろと。
まずは公式サイトの解説を参考にしてみる。
まずは公式サイトの解説を参考にしてみる。
Addons Node.js v0.6.12 Manual & Documentationl
http://nodejs.org/docs/latest/api/addons.html
http://nodejs.org/docs/latest/api/addons.html
Hello World
最初にHello Worldのコードが載っているがusing namespace v8;とあるので早速この行を消して、修飾を補完して書くとこうなる。
#include <node.h>
#include <v8.h>
v8::Handle<v8::Value> Method(const v8::Arguments& args) {
v8::HandleScope scope;
return scope.Close(v8::String::New("world"));
}
void init(v8::Handle<v8::Object> target) {
target->Set(v8::String::NewSymbol("hello"),
v8::FunctionTemplate::New(Method)->GetFunction());
}
NODE_MODULE(hello, init)
v8::Stringやv8::ObjectというクラスがJSのそれぞれの型を表現しており、v8.hで定義されている模様。v8.hのコードを眺めるとJavaScriptの型が全て定義されているのがわかる。NODE_MODULEマクロがどこで定義されているかを探すと node.h で定義されている。
#define NODE_MODULE(modname, regfunc) \
extern "C" { \
NODE_MODULE_EXPORT node::node_module_struct modname ## _module = \
{ \
NODE_STANDARD_MODULE_STUFF, \
regfunc, \
NODE_STRINGIFY(modname) \
}; \
}
モジュールエクスポート用の関数とモジュールの名前を渡す物らしい。なので上記Hello Worldのコードは、Stringの"world"を返すhelloというメソッドを一つ持つhelloモジュールを作っている。ビルド
次にモジュールをビルドするためのwscriptのコードが載っている。ビルドするにはwscriptを作ってnode-wafコマンドを使う。
node-wafはpythonのビルドツールのhttp://docs.waf.googlecode.com/git/apidocs_16/index.htmlそのものと書いてある。rubyにおけるrakeコマンドとRakefileみたいな物なのかな。例として載っている
node-waf configure buildはconfigureタスクの後にbuildタスクを実行する。
wscriptの1行目
srcdir = '.'を適当に変えてソースディレクトリを指すようにしたら、何故かソースが読み込まれない。WAFのドキュメントにもsrcdirは載っていないので、wscriptはソースディレクトリに配置して使うしか無いのかも。
続きます Node.jsのモジュールをC++で書く (引数と戻り値)