节点JS – 模块没有自行注册

我经历了不同的职位,其中大部分人build议重build/重新安装/更新npm,我尝试了,但没有帮助。

我想用C ++的node.js的例子,下面是文件的细节
TestNode.cpp

#include<iostream> class TestNode { public: void printHelloW() { std::cout << "Hello World!!!"; } }; 

binding.gyp

 { "targets": [ { "target_name": "newexample", "sources": [ "TestNode.cpp" ] } ] } 

现在来执行,它会抛出错误,说模块不是自我注册。

 D:\newexample>node-gyp configure gyp info it worked if it ends with ok gyp info using node-gyp@3.3.1 gyp info using node@5.10.0 | win32 | x64 gyp info spawn C:\Python27\python.exe gyp info spawn args [ 'C:\\Users\\rtv\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\gyp\\gyp_main.py', gyp info spawn args 'binding.gyp', gyp info spawn args '-f', gyp info spawn args 'msvs', gyp info spawn args '-G', gyp info spawn args 'msvs_version=auto', gyp info spawn args '-I', gyp info spawn args 'D:\\newexample\\build\\config.gypi', gyp info spawn args '-I', gyp info spawn args 'C:\\Users\\rtv\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\addon.gypi', gyp info spawn args '-I', gyp info spawn args 'C:\\Users\\rtv\\.node-gyp\\5.10.0\\include\\node\\common.gypi', gyp info spawn args '-Dlibrary=shared_library', gyp info spawn args '-Dvisibility=default', gyp info spawn args '-Dnode_root_dir=C:\\Users\\rtv\\.node-gyp\\5.10.0', gyp info spawn args '-Dnode_gyp_dir=C:\\Users\\rtv\\AppData\\Roaming\\npm\\node_modules\\node-gyp', gyp info spawn args '-Dnode_lib_file=node.lib', gyp info spawn args '-Dmodule_root_dir=D:\\newexample', gyp info spawn args '--depth=.', gyp info spawn args '--no-parallel', gyp info spawn args '--generator-output', gyp info spawn args 'D:\\newexample\\build', gyp info spawn args '-Goutput_dir=.' ] gyp info ok D:\newexample>node-gyp build gyp info it worked if it ends with ok gyp info using node-gyp@3.3.1 gyp info using node@5.10.0 | win32 | x64 gyp info spawn C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe gyp info spawn args [ 'build/binding.sln', gyp info spawn args '/clp:Verbosity=minimal', gyp info spawn args '/nologo', gyp info spawn args '/p:Configuration=Release;Platform=x64' ] Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch. TestNode.cpp win_delay_load_hook.c Generating code Finished generating code newexample.vcxproj -> D:\newexample\build\Release\\newexample.node gyp info ok D:\newexample>node > var obj=require("./build/Release/newexample") Error: Module did not self-register. at Error (native) at Object.Module._extensions..node (module.js:440:18) at Module.load (module.js:357:32) at Function.Module._load (module.js:314:12) at Module.require (module.js:367:17) at require (internal/module.js:16:19) at repl:1:9 at REPLServer.defaultEval (repl.js:269:27) at bound (domain.js:287:14) at REPLServer.runBound [as eval] (domain.js:300:12) > 

版本信息

 D:\newexample>node -v v5.10.0 D:\newexample>npm -v 3.8.3 D:\newexample>node-gyp -v v3.3.1 OS: Windows 7 Professional 64-bit 

要求你指导我解决这个错误。

编写一个node.js插件不是那么简单,你需要明确地导出函数并调用合适的macros来注册插件到节点的模块系统。 阅读Addons文档以获取更多信息和示例。

使用node-gyp开发Node.js插件是有点棘手的。 您的.cpp文件需要非常适合在Node.js环境中工作。

我build议从Node.js C / C ++ Addons文档中的第一个“Hello World”示例开始。

这里是你的.ccp文件中缺less的(非详尽的)列表。

Node.js C ++库

 #include <node.h> 

向Node.js公开方法的'init'函数 这里我们可以看到,在Javascript中调用addon.hello()会调用C ++中的Method函数(这里没有显示)。

 void init(Local<Object> exports) { NODE_SET_METHOD(exports, "hello", Method); } 

定义addon名称和init函数的NODE_MODULE调用(上面)。 这个函数的第一个参数(当前addon )必须与binding.gyp文件中的"target_name"值匹配。 在你的情况下,新的例子。

 NODE_MODULE(addon, init)