nodejs的C/C++ addons机制是怎么实现的?
它的编译器是GCC吗?原理是否跟GCC编译共享库的原理一样?
4 回复
V8 好像有这个API
技术上说就是动态库,windows下就是 dll
Linux下是gcc和共享库,笔者亲测……
#define NODE_MODULE(modname, regfunc) \
extern "C" { \
NODE_MODULE_EXPORT node::node_module_struct modname ## _module = \
{ \
NODE_STANDARD_MODULE_STUFF, \
regfunc, \
NODE_STRINGIFY(modname) \
}; \
}
NODE_MODULE(name, init);
展开后就是:
extern "C" {
node::node_module_struct name_module =
{
1,//NODE_MODULE_VERSION
NULL,
__FILE__,
init,
"name"
};
}
其实就是定义了一个结构体,编译后为动态链接库 .node 文件中的一个符号,最后使用的时候由 node.cc 调用uv_dlopen
和uv_dlsym
动态链接模块,得到初始化函数并执行。
mod->register_func(target);
uv库封装了对动态链接文件操作的具体实现,win下实际调用 LoadLibraryExW 和 GetProcAddress,*nix下实际调用dlopen和dlsym实现上诉功能。