onvno / pokerface

日常技术文章阅读整理
3 stars 0 forks source link

20190804 - Node - C++ #52

Open onvno opened 5 years ago

onvno commented 5 years ago

写一个C++插件

onvno commented 5 years ago

C++已有包转换使用

onvno commented 5 years ago

Node官方C++ Addon实例

node-addon-examples:有很多可做参考

onvno commented 5 years ago

方案整理

方案

  1. 安装依赖 根据资料收集,猜测可以依赖如下包实现:

    • node-gyp: 用来重新编译依赖包
    • node-ffi:使用Javascript调用动态库
    • ref:用来定义数据类型,提供指针功能
    • ref-array:用Buffer来实现C语言中的 array 数据类型
    • ref-struct:结构体

      装之前要安装python 2.7,而node-gyp不支持Python 3.x,所以安装了多个版本Python的读者得留意一下自己当前的Python版本了。Linux下pythonbrew一键搞定,Windows下还得去改环境变量。并且,如果你使用的node.js版本是4.0+,node-gyp的安装依赖支持C++11语法的gcc,你需要确定当前环境的gcc版本至少高于4.8。

  2. C++代码转为sodll文件

    ffi只能调用C风格的模块。 需要将C源码build成动态链接库以供调用,在Linux下将C源码build成.so文件,在windows下build成.dll文件。本文只阐述.so文件的调用方法,调用.dll差别不大。 在Linux下如果使用C++编写的addon来调用.so文件,需要将.so文件为系统共享。具体方法可以参看ldconfig命令,这是一个Linux下的动态链接库管理命令。ldconfig命令的主要用途是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib.so),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。

  3. 类型转换

方案优缺点

与Node.js Addons相比,此方法有如下优点:

  1. 不需要源代码。
  2. 不需要每次重编译nodeNode.js Addons引用的.node会有文件锁,会对`electron应用热更新造成麻烦。
  3. 不要求开发者编写C代码,但是仍要求开发者具有一定C的知识。

缺点是:

  1. 性能有折损
  2. 类似其他语言的FFI调试,此方法近似黑盒调用,差错比较困难。

参考链接

更多可能性

值得一提的是,还有一个名为edge.js的开源项目,整个流程和FFI类似,不过支持调用C#、Python,相当有意思。这样一来,NodeJS相当于可以用C/C++、C#、Python扩展了,潜力无限啊。当然,你可以说我直接拿其它语言写程序然后NodeJS里fork()就好了,不过其灵活性显然是不如以上思路的。