• node-gyp编译c++编写的node扩展


        node有一个模块addon,翻译过来,是插件,但是有的地方也叫扩展,这部分是用c++来编写的,最后可以通过node-gyp来针对各个平台编译适合自己平台的扩展,做到了跨平台。而编译后的这部分,node可以直接调用,无需额外代码。

        而通过node-gyp编译,在windows下,需要msbuild环境,可以直接安装visual studio 2017,也可以通过npm install -g windows-build-tools来安装,另外,还需要python环境,这个对python版本没有要求,只要有就可以。既然是node-gyp编译,自然需要全局安装node-gyp,最简单的还是npm install -g node-gyp。

        下面通过一个简单的示例来演示,node如何编译以及调用c++扩展。

         先准备一个c++代码,hello_world.cc

    1. #include
    2. void Method(const v8::FunctionCallbackInfo& args) {
    3. v8::Isolate* isolate = args.GetIsolate();
    4. args.GetReturnValue().Set(v8::String::NewFromUtf8(
    5. isolate, "world").ToLocalChecked());
    6. }
    7. void Initialize(v8::Local exports) {
    8. NODE_SET_METHOD(exports, "hello", Method);
    9. }
    10. NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)

        这里定义了一个返回值为world的函数hello,通过关键字exports,module我们大概知道,这类似于node模块对外暴露方法:module.exports = {hello} 

         binding.gyp

    1. {
    2. "targets": [
    3. {
    4. "target_name": "hello_world",
    5. "sources": [ "hello_world.cc" ]
    6. }
    7. ]
    8. }

         callhello.js

    1. const binding = require('./build/Release/hello_world');
    2. console.log(binding.hello());

        这里我们通过require引入的是hello_world.node模块,他是通过node-gyp build生成的。 

         package.json

    1. {
    2. "dependencies": {
    3. "java": "^0.12.2"
    4. },
    5. "scripts": {
    6. "start": "node callhello.js",
    7. "build":"node-gyp configure && node-gyp build"
    8. }
    9. }

        在命令行下先运行构建命令:

    npm run build

     

        可以看到用到了系统安装的python 、visual studio 2017编译环境。 

        最后生成一个hello_world.node的扩展。

        执行调用:

     

        这种调用的确很简单,但是对环境要求很高,需要从源码编译。而编写c++扩展,它不是纯c的内容,它需要严重依赖node库,api侵入很深,基本上借助c++来写了一个贴合node语言的扩展,所以在调用的时候,直接require就可以使用了。

        以前我写过c++动态链接库,然后通过node调用,这种动态库,完全脱离了node api,纯粹使用c来实现,但是最后编译成动态库,node还需要通过三方库ffi来调用,就没有那么方便了。

        node扩展偏向于node  api,适合熟悉node的人编写,最后调用也简单。动态库,偏向于c原生的语法,适合熟悉c/c++的人编写,最后生成的动态链接库需要三方ffi依赖调用,显然复杂度更高一些。     

  • 相关阅读:
    技术管理者的管理框架
    CTFshow-PWN-栈溢出(pwn43)
    TypeScript环境配置详解
    免费小程序HTTPS证书
    深度解读汽车域控制器
    携程AI布局:三重创新引领旅游行业智能化升级
    【C++】STL详解(八)—— priority_queue的使用及模拟实现&&仿函数
    二维码智慧门牌管理系统:提升城市管理效率与便捷性
    Python爬虫使用需要注意什么?应用前景如何?
    电子元器件销售ERP管理系统哪个比较好?
  • 原文地址:https://blog.csdn.net/feinifi/article/details/127760736