2016-04-06 161 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