它的编译器是GCC吗?原理是否跟GCC编译共享库的原理一样?
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);展开后就是:
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动态链接模块,得到初始化函数并执行。
uv_dlopen
uv_dlsym
mod->register_func(target);
uv库封装了对动态链接文件操作的具体实现,win下实际调用 LoadLibraryExW 和 GetProcAddress,*nix下实际调用dlopen和dlsym实现上诉功能。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
V8 好像有这个API
技术上说就是动态库,windows下就是 dll
Linux下是gcc和共享库,笔者亲测……
NODE_MODULE(name, init);展开后就是:其实就是定义了一个结构体,编译后为动态链接库 .node 文件中的一个符号,最后使用的时候由 node.cc 调用
uv_dlopen和uv_dlsym动态链接模块,得到初始化函数并执行。uv库封装了对动态链接文件操作的具体实现,win下实际调用 LoadLibraryExW 和 GetProcAddress,*nix下实际调用dlopen和dlsym实现上诉功能。