我经历了不同的帖子和他们中的大多数建议重建/重新安装/更新我尝试过的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" ]
}
]
}
现在执行&amp;它会抛出错误,说模块不是自行注册的。
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
请您指导我解决此错误。
答案 0 :(得分:1)
编写node.js插件并不是那么简单,您需要显式导出函数并调用相应的宏来向节点的模块系统注册插件。请阅读Addons documentation以获取更多信息和示例。
答案 1 :(得分:1)
使用node-gyp为Node.js开发插件有点棘手。您的.cpp文件需要非常适合在Node.js环境中工作。
我建议从Node.js C/C++ Addons Documentation的第一个“Hello World”示例开始。
以下是.ccp文件中缺少的(非详尽的)列表。
Node.js C ++库
#include <node.h>
一个'init'函数,它向Node.js公开方法。在这里我们可以看到在Javascript中调用addon.hello()
将在C ++中调用Method
函数(此处未显示)。
void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}
NODE_MODULE调用,它定义了插件名称和init函数(上图)。此函数的第一个参数(当前为addon
)必须与"target_name"
文件中的binding.gyp
值匹配。在您的情况下,newexample
。
NODE_MODULE(addon, init)