node.js调用动态库

网上找了一大堆,看起来都是可行的,实践时有很多问题,后边在列出部分问题,这里只说一下解决,那就是这些都写的是node.js V0.10.*之前的,现在我装的是v6.11.0

所以说文章还是要写清楚。

代码不复杂,这里分别列出:

C++ 动态库的程序

官方提到了,最重要的就是下面这里。

void Initialize(Local<Object> exports);
NODE_MODULE(module_name, Initialize)


// hello.cc
#include <node.h>

namespace demo {

using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;

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

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

NODE_MODULE(addon, init)

}  // namespace demo

在写一个binding.gyp 注意其中的addon和cc文件中结尾的NODE_MODULE的第一个参数一样,sources就不用多说了。


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

再准备一个调用的js 文件

// hello.js
const addon = require('./build/Release/addon');

console.log(addon.hello());
// Prints: 'world'

路径将来可以改,由于这里编译后就是这个路径,就不改了。

好了,三个程序放到一个目录下

然后cmd进入这个目录,(这里是windows啊)

分别输入

node-gyp configure

node-gyp build

node hello.js

你就可以看到屏幕输出 world  

什么,你出错了~~~~~,那要看看你准备的工具是不是全了,我装了vs2010和vs2015,其实这两个有一个就应该可以。在configure的时候可以指定。

node.js安装了,还要安装node-gyp,以及python2.7,不能是3.X以上的版本。这些有很多帖子可以介绍,我就不说了。

最后截图

这是成功的。



失败的图,因为代码用的是搜到的老版本的


看到这些,你要看看的C++代码是不是下面

#include <node.h>
#include <v8.h>
using namespace v8;
 
// 这里是 hello 函数的 C++ 实现部分
Handle<Value> Method(const Arguments& args) {
  HandleScope scope;
  return scope.Close(String::New("world"));
}
 
// 这里是模块的初始化函数,必须有
void init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("hello"),
      FunctionTemplate::New(Method)->GetFunction());
}
 
// 这里定义本模块的名字和初始化函数
NODE_MODULE(hello, init)
那恭喜了,你要么安装node.js v0.10以前的版本,要么就别看它了!!!!






发布了14 篇原创文章 · 获赞 4 · 访问量 7445

猜你喜欢

转载自blog.csdn.net/yxmlhc/article/details/74467364