1
votes

I use node-gyp to build my c++ library for node, and copy some examples on the web.

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

run node-gyp configure ok. run node-gyp build fail, error:

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 

I'm not a c++ coder, please help me.

node: 7.9.0

node-gyp: 3.6.0

xcode: 8.1

mac: 10.12.4

gcc: Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 8.0.0 (clang-800.0.42.1) Target: x86_64-apple-darwin16.5.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

1

1 Answers

0
votes

I have solved it. Because the c++ code in demo is outdated.

the new codes like:

#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);

there are too many outdated examples on the web, I will keep this question