成功编译节点模块和“模块没有自行注册”。

我决定在Windows 8.1 32位下使用VS2015编译器和node-gyp编写Node的本地模块。 我使用这个页面的指示。 我search了互联网(包括StackOverflow)寻找解决我的问题。

我使用以下版本:

  • 节点:4.6.0
  • Node-gyp:3.4.0

模块的源代码:

// main.c++ #include <node.h> #include <v8.h> void Method(const v8::FunctionCallbackInfo<v8::Value>& args) { v8::Isolate* isolate = args.GetIsolate(); v8::HandleScope scope(isolate); args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, "world")); } void init(v8::Local<v8::Object> target) { NODE_SET_METHOD(target, "hello", Method); } NODE_MODULE(sapphire, init); 
 // binding.gyp { "targets": [ { "target_name": "sapphire", "sources": [ "main.c++" ] } ] } 

每次编译(在addon的源代码文件夹内调用node-gyp rebuild )成功。 在编译Node-Gyp打印之前,编译为node@4.6.0 | win32 | ia32 node@4.6.0 | win32 | ia32 node@4.6.0 | win32 | ia32 。 一切看起来很好,直到这一点。

为了testing,我写了最简单的脚本。

 // test.js try { var sapphire = require('/build/Release/sapphire'); console.log(sapphire.hello()); } catch(err) { console.log(err); } 

结果是打印错误Error: Module did not self-register. 。 我尝试用NANreplaceNode和V8(按照本教程 )。 但结果是一样的。

在寻找解决我的问题的过程中,我遇到了两个可能的原因:

  • 版本不正确(库与解释器相比)。 不幸的是,消除了这种可能性,Node-Gyp明确地使用了与我所使用的解释器相同的库版本。
  • 从node_modules重新下载模块。 我真的不明白为什么。 所有必要的模块在安装Node-Gyp的过程中都被更新了,其余的都没有关系。

什么会导致这个错误? 该模块的源代码是从该教程的Node(v4.6.0)的文档中下载的。 我也试图做一些小的改动,并且使用包括NAN在内的各种非官方指南。 每次问题都是一样的。

node-gyp(用于构build节点插件的工具)倾向于做出一些假设,至less在编译源文件时是如此。 例如,它会根据源文件的扩展名自动select“正确的”编译器。 所以如果你有一个'.c'文件,它使用C编译器,如果你有'.cc'文件(或者'.cpp'文件),它使用C ++编译器。

'.c ++'不是C ++源文件的常用文件扩展名,所以node-gyp可能会以意想不到的方式解释扩展名(可能是C源文件)。 将扩展更改为更常见的东西可能会有所帮助。