void init(Handle<Object> exports)
{
//… 嗷嗷待写你妹啊!#゚Å゚)⊂彡☆))゚Д゚)・∵
}
这是龟腚!函数名什么的无所谓,但是传入的参数一定是一个 Handle<Object>,代表我们下面将要在这货上导出东西。
然后,我们就在这里面写上导出的东西了:
void init(Handle<Object> exports)
{
exports->Set(String::NewSymbol(“hello”),
FunctionTemplate::New(Hello)->GetFunction());
}
大致的意思就是说,为这个 exports 对象添加一个字段叫 hello,所对应的东西是一个函数,而这个函数就是我们亲爱的 Hello 函数了。
用伪代码写直白点就是:
void init(Handle<Object> exports)
{
exports.Set(“hello”, function hello);
}
大功告成!
(大功告成你妹啊!闭嘴( ‘д‘⊂彡☆))Д´)
真·导出
这才是最后一步,我们最后要申明,这个就是导出的入口,所以我们在代码的末尾加上这一行:
NODE_MODULE(hello, init)
纳了个尼?!这又是什么东西?
别着急,这个 NODE_MODULE 是一个宏,它的意思呢就是说我们采用 init 这个初始化函数来把要导出的东西导出到 hello 中。那么这个 hello 哪来呢?
它来自文件名!对,没错,它来自文件名。你并不需要事先申明它,你也不必担心不能用,总之你的这个最终编译好的二进制文件名叫什么,这里的 hello 你就填什么,当然要除去后缀名了。
详见官方文档。
Note that all Node addons must export an initialization function:
void Initialize (Handle<Object> exports);
NODE_MODULE(module_name, Initialize)
There is no semi-colon after NODE_MODULE as it’s not a function (see node.h).
The module_name needs to match the filename of the final binary (minus the .node suffix).
编译 (๑•́ ₃ •̀๑)
来吧,让我们一起编译吧!
我们再新建一个类似于 Makefile 的归档文件吧——binding.gyp。
并且在里面添加这样的代码:
{
“targets”: [
{
“target_name”: “hello”,
“sources”: [ “hello.cc” ] }
]}
为什么这么写呢?可以参考 node-gyp 的官方文档。
configure
在文件搞好之后,我们要在这个目录下面执行这个命令了:









