2016-10-14 1 views
1

나는 Windows 8.1 32bit에서 VS2015 컴파일러와 node-gyp를 사용하여 Node 용 네이티브 모듈을 작성하기로 결정했다. 나는 this page의 지시에 따라 일했다. 내 문제에 대한 해결책을 찾아 인터넷 (StackOverflow 포함)을 검색했습니다.노드 모듈을 성공적으로 컴파일하고 "모듈이 자체 등록하지 않았습니다."

나는 다음 버전을 사용 :

  • 노드 : 4.6.0
  • 노드 사기꾼 : 3.4.0

모듈의 소스 코드 :

// 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++" ] 
     } 
    ] 
} 

Ev ery 시간 컴파일 (내부 애드온의 소스 코드 폴더라고하는 node-gyp rebuild)이 성공합니다. 컴파일하기 전에 [email protected] | win32 | ia32에 대해 컴파일되는 Node-Gyps 인쇄물. 그 시점까지 모든 것이 좋았습니다.

테스트를 위해 가장 간단한 스크립트를 작성했습니다.

// test.js 
try { 
    var sapphire = require('/build/Release/sapphire'); 
    console.log(sapphire.hello()); 
} catch(err) { 
    console.log(err); 
} 

결과는 오류 Error: Module did not self-register.을 인쇄 하였다. 나는 노드와 V8을 NAN (다음)으로 대체하려고 시도했다. 그러나 결과는 동일했습니다. (인터프리터에 비해 라이브러리)

  • 잘못된 버전 : 내 문제에 대한 해결책에 대한 검색 동안

    나는 두 가지 가능성에 걸쳐왔다. 불행히도이 가능성을 제거한 Node-Gyp은 내가 사용하는 인터프리터와 동일한 라이브러리 버전을 사용합니다.
  • node_modules에서 모듈을 다시 다운로드하십시오. 나는 정직하게 이유를 이해하지 못한다. Node-Gyp 설치 중에 필요한 모든 모듈이 업데이트되었으므로 나머지는 중요하지 않습니다.

이 오류의 원인은 무엇입니까? 모듈의 소스 코드는 노드 (v4.6.0)의 설명서에서 자습서에서 다운로드되었습니다. 나는 또한 작은 변화를 만들고 NAN을 포함한 모든 비공식 가이드를 사용하려고 노력했다. 문제가 같을 때마다.

+0

'.C++'는 C++ 소스 파일의 공통 파일 확장자가 아닙니다. 나는 파일 확장자를 '.cc'와 같은 것으로 바꾸는 것이 파일 확장자와 다른 것들을 기반으로 다른 컴파일러 (C vs C++)를 선택하는 것을 보았 기 때문에 대신 도움이 될지 궁금합니다. – mscdex

+0

@mscdex 나는 그것을 믿을 수 없다. 네가 옳아! 나는 그 연장이 아무 것도 바뀌지 않는다고 확신했다. 이제 완벽하게 작동합니다! 가능한 경우 대답으로 다시 작성하십시오. – Maxie

답변

3

node-gyp (노드 애드온을 빌드하는 데 사용되는 도구)은 최소한 소스 파일을 컴파일 할 때 몇 가지 가정을하는 경향이 있습니다. 예를 들어 소스 파일의 확장자를 기반으로 "올바른"컴파일러를 자동으로 선택합니다. 따라서 '.c'파일이 있으면 C 컴파일러를 사용하고 '.cc'파일 (또는 '.cpp'파일)이 있으면 C++ 컴파일러를 사용합니다.

'.C++'는 C++ 소스 파일의 일반적인 파일 확장자가 아니므로 node-gyp가 예상치 못한 방식으로 확장명을 해석 할 수 있습니다 (C 소스 파일 일 가능성이 있음). 확장 프로그램을 좀 더 일반적인 것으로 변경하면 도움이 될 수 있습니다.

관련 문제