2016-04-06 104 views
2

我经历了不同的帖子&他们大多数人建议重建/重新安装/更新npm,我试过了,但没有任何帮助。节点JS - 模块没有自注册

我试图与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 [email protected] 
gyp info using [email protected] | 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 [email protected] 
gyp info using [email protected] | 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 

请你指导我解决这个错误。

+0

你是否解决了这个问题?如果是的话,意味着要发布答案,因为我也面临同样的问题。 – user3182143

回答

1

编写node.js插件并不那么简单,您需要明确地导出函数并调用相应的宏来将插件注册到节点的模块系统。阅读Addons documentation了解更多信息和示例。

0

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

我建议从Node.js C/C++ Addons Documentation的第一个“Hello World”示例开始。

以下是您的.ccp文件中缺少的(非详尽的)列表。

Node.js的C++库

#include <node.h> 

一个 '初始化' 功能,其暴露的方法来Node.js的在这里我们可以看到,在Javascript中调用addon.hello()将调用C++中的Method函数(此处未显示)。

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

甲NODE_MODULE呼叫定义了插件名称和初始化函数(上图)。此函数的第一个参数(当前为addon)必须与binding.gyp文件中的"target_name"值匹配。在你的情况下,newexample

NODE_MODULE(addon, init) 
+0

这是一个完整的参考示例https://blog.scottfrees.com/building-an-asynchronous-c-addon-for-node-js-using-nan – stanleyxu2005