2017-04-19 244 views
1

我使用node-gyp構建節點的C++庫,並在Web上覆制一些示例。node-gyp build error「在mac上調用類」v8 :: HandleScope「的受保護構造函數

callback.cc

#include <node.h> 
#include <v8.h> 
using namespace v8; 
Handle<Value> Method(const v8::internal::Arguments& args){ 
    HandleScope scope; 
    return scope.Close(String::New("hello,world")); 
} 
void init(Handle<Object> exports) { 
    exports->Set(String::NewSymbol("hello"),FunctionTemplate::New(Method)->GetFunction()); 
} 
NODE_MODULE(hello, init) 

binding.gyp

{ 
    "targets": [ 
    { 
     "target_name": "hello", 
     "sources": [ "callback.cc" ] 
    } 
    ] 
} 

運行node-gyp configure確定。 運行node-gyp build失敗,錯誤:

gyp info it worked if it ends with ok 
gyp info using [email protected] 
gyp info using [email protected] | darwin | x64 
gyp info spawn make 
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] 
    CXX(target) Release/obj.target/hello/callback.o 
../callback.cc:5:15: error: calling a protected constructor of class 'v8::HandleScope' 
    HandleScope scope; 
     ^
/Users/zhouweiming/.node-gyp/7.9.0/include/node/v8.h:908:13: note: declared protected here 
    V8_INLINE HandleScope() {} 
     ^
../callback.cc:6:16: error: no member named 'Close' in 'v8::HandleScope' 
    return scope.Close(String::New("hello,world")); 
    ~~~~~^
../callback.cc:6:30: error: no member named 'New' in 'v8::String' 
    return scope.Close(String::New("hello,world")); 
       ~~~~~~~~^ 
../callback.cc:9:65: error: cannot initialize a parameter of type 'v8::Isolate *' with an lvalue of type 'Handle<v8::Value> (const v8::internal::Arguments &)' 
    (aka 'v8::Local<v8::Value> (const v8::internal::Arguments &)') 
    exports->Set(String::NewSymbol("hello"),FunctionTemplate::New(Method)->GetFunction()); 
                  ^~~~~~ 
/Users/zhouweiming/.node-gyp/7.9.0/include/node/v8.h:5079:16: note: passing argument to parameter 'isolate' here 
     Isolate* isolate, FunctionCallback callback = 0, 
     ^
../callback.cc:9:24: error: no member named 'NewSymbol' in 'v8::String' 
    exports->Set(String::NewSymbol("hello"),FunctionTemplate::New(Method)->GetFunction()); 
      ~~~~~~~~^ 
5 errors generated. 
make: *** [Release/obj.target/hello/callback.o] Error 1 
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2 
gyp ERR! stack  at ChildProcess.onExit  (/usr/local/lib/node_modules/.node-gyp_npminstall/node_modules/.node- [email protected]/lib/build.js:285:23) 
gyp ERR! stack  at emitTwo (events.js:106:13) 
gyp ERR! stack  at ChildProcess.emit (events.js:194:7) 
gyp ERR! stack  at Process.ChildProcess._handle.onexit (internal/child_process.js:215:12) 
gyp ERR! System Darwin 16.5.0 
gyp ERR! command "/usr/local/Cellar/node/6.9.1/bin/node" "/usr/local/bin/node-gyp" "build" 
gyp ERR! cwd /Users/zhouweiming/data/project/electron-projects/dll 
gyp ERR! node -v v7.9.0 
gyp ERR! node-gyp -v v3.6.0 
gyp ERR! not ok 

我不是一個C++編碼器,請幫助我。

節點:7.9.0

節點-GYP:3.6.0

xcode中:8.1

MAC:10.12.4

GCC: 配置有:前綴= /Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir =/usr/include/C++/4.2.1 Apple LLVM版本8.0.0(clang-800.0.42.1) 目標:x86_64 -apple-darwin16.5.0 Thread m odel:posix InstalledDir:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

回答

0

我已經解決了它。因爲demo中的C++代碼已過時。

新的代碼,如:

#include <node/v8.h> 
#include <node/node.h> 

using namespace node; 
using namespace v8; 

void Method(const v8::FunctionCallbackInfo<v8::Value>& args) { 
    v8::Isolate* isolate = args.GetIsolate(); 
    v8::HandleScope scope(isolate); 
    args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, "Hello world")); 
} 

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

NODE_MODULE(binding, init); 

有在網絡上太多過時的例子,我會因爲你使用的是各自的命名空間保持這個問題

+0

,你不需要指定報表中的範圍。例如,v8 ::可以被刪除。 – asam

相關問題