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

时间:2016-10-14 16:32:28

标签: c++ node.js node-gyp

我决定在Windows 8.1 32位下使用VS2015编译器和node-gyp为Node编写本机模块。我使用了this page的说明。我搜索了互联网(包括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++" ]
        }
    ]
}

每次编译(node-gyp rebuild在addon的源代码文件夹中调用)都会成功。在编译之前编译为node@4.6.0 | win32 | ia32编译的Node-Gyp。到那时为止,一切看起来都很好。

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

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

结果显示错误Error: Module did not self-register.。我试图用NAN替换Node和V8(跟this tutorial之后)。但结果是一样的。

在搜索我的问题的解决方案期间,我遇到了两个可能的原因:

  • 版本不正确(库与解释器相比)。遗憾的是,Node-Gyp消除了这种可能性,显然使用了与我使用的解释器相同的库版本。
  • 从node_modules重新下载模块。老实说,我不明白为什么。在安装Node-Gyp期间,所有必要的模块都已更新,其余的无关紧要。

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

1 个答案:

答案 0 :(得分:4)

node-gyp(用于构建节点插件的工具)倾向于做出一些假设,至少在编译源文件时是这样。例如,它将根据源文件的扩展名自动选择“正确”的编译器。因此,如果您有一个'.c'文件,它使用C编译器,如果您有一个'.cc'文件(或者可能是'.cpp'文件),它就会使用C ++编译器。

'。c ++'不是C ++源文件的通用文件扩展名,因此node-gyp可能以意外的方式解释扩展名(可能是C源文件)。将扩展名更改为更常见的内容可能有所帮助。

相关问题