C++ 成功编译节点模块和;模块未自动注册。”;

C++ 成功编译节点模块和;模块未自动注册。”;,c++,node.js,node-gyp,C++,Node.js,Node Gyp,我决定在Windows 8.1 32位下使用VS2015编译器和Node gyp为Node编写本机模块。我按照老师的指示工作。我在互联网上搜索(包括StackOverflow),寻找解决问题的方法 我使用以下版本: 节点:4.6.0 节点gyp:3.4.0 模块的源代码: 每次编译(node gyp rebuild在插件的源代码文件夹中调用)成功时。编译前,Gyp打印为node@4.6.0| win32 | ia32。在那之前一切看起来都很好 为了测试,我编写了最简单的脚本。 结果是打印

我决定在Windows 8.1 32位下使用VS2015编译器和Node gyp为Node编写本机模块。我按照老师的指示工作。我在互联网上搜索(包括StackOverflow),寻找解决问题的方法

我使用以下版本:

  • 节点:4.6.0
  • 节点gyp:3.4.0
模块的源代码:

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

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

结果是打印错误
错误:模块未自注册。
。我尝试用NAN替换Node和V8(如下所示)。但结果是一样的

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

  • 版本不正确(库与解释器相比)。不幸的是,排除了这种可能性,Node Gyp显然使用了与解释器相同的库版本,我使用的解释器
  • 从节点_模块重新下载模块。我真的不明白为什么。在安装Node Gyp的过程中,所有必要的模块都已更新,其余模块则无关紧要
什么会导致此错误?该模块的源代码是从节点文档(v4.6.0)的教程中下载的。我还尝试做一些小改动,使用各种非官方的指南,包括NAN的指南。每次问题都是一样的。

节点gyp(用于构建节点插件的工具)倾向于做出一些假设,至少在编译源文件时是这样。例如,它将根据源文件的扩展名自动选择“正确”的编译器。因此,如果你有一个.c'文件,它使用C编译器,如果你有一个'.cc'文件(或者也许'.cpp文件),它使用C++编译器。
“C++”不是C++源文件的通用文件扩展,因此节点GYP可以以意想不到的方式解释扩展(可能是C源文件)。将扩展名更改为更常见的扩展名可能会有所帮助。

node gyp(用于构建节点加载项的工具)倾向于做出一些假设,至少在编译源文件时是这样。例如,它将根据源文件的扩展名自动选择“正确”的编译器。因此,如果你有一个.c'文件,它使用C编译器,如果你有一个'.cc'文件(或者也许'.cpp文件),它使用C++编译器。
“C++”不是C++源文件的通用文件扩展,因此节点GYP可以以意想不到的方式解释扩展(可能是C源文件)。将扩展扩展到更普通的东西可能会有所帮助。C++程序不是C++源文件的通用文件扩展。我想知道将文件扩展名改为“.cc”是否会有所帮助,因为我看到node gyp根据文件扩展名和其他类似内容选择了不同的编译器(c vs c++)。@mscdex我简直不敢相信。你说得对!我确信,最终延长期限不会改变任何事情。现在它工作得很好!如果可以的话,改写为“答案”。“C++”不是C++源文件的通用文件扩展名。我想知道将文件扩展名改为“.cc”是否会有所帮助,因为我看到node gyp根据文件扩展名和其他类似内容选择了不同的编译器(c vs c++)。@mscdex我简直不敢相信。你说得对!我确信,最终延长期限不会改变任何事情。现在它工作得很好!如果可以,重写它作为答案。
// 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);
// test.js
try {
    var sapphire = require('/build/Release/sapphire');
    console.log(sapphire.hello());
} catch(err) {
    console.log(err);
}