我决定在Windows 8.1 32位下使用VS2015编译器和node-gyp为Node编写本机模块。我使用了this page的说明。我搜索了互联网(包括StackOverflow)以寻找我的问题的解决方案。
我使用以下版本:
模块的源代码:
// 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(v4.6.0)的文档中的教程中下载的。我也试图做一些小改动,并使用包括NAN在内的各种非官方指南。每次问题都是一样的。
答案 0 :(得分:4)
node-gyp(用于构建节点插件的工具)倾向于做出一些假设,至少在编译源文件时是这样。例如,它将根据源文件的扩展名自动选择“正确”的编译器。因此,如果您有一个'.c'文件,它使用C编译器,如果您有一个'.cc'文件(或者可能是'.cpp'文件),它就会使用C ++编译器。
'。c ++'不是C ++源文件的通用文件扩展名,因此node-gyp可能以意外的方式解释扩展名(可能是C源文件)。将扩展名更改为更常见的内容可能有所帮助。