nodejs的C/C++ addons机制是怎么实现的?
发布于 12 年前 作者 gaubee 7742 次浏览 最后一次编辑是 8 年前

它的编译器是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_dlopenuv_dlsym动态链接模块,得到初始化函数并执行。

mod->register_func(target);

uv库封装了对动态链接文件操作的具体实现,win下实际调用 LoadLibraryExW 和 GetProcAddress,*nix下实际调用dlopen和dlsym实现上诉功能。

回到顶部