说说初学者 NodeJS 用 ffi 调用 C++ 的坑

96
Spooking
2021-05-12 15:25:35 字数 274 阅读 0

初学者调用从网上搜索 nodejs 调用 c++ 的案例, 看上去最简单的莫过于用 ffi , 只需要如下代码就OK了

var ffi = require('ffi');

//第一个形参为dll所在位置(dll文件可以不用加.dll),第二个为函数信息
var libm = ffi.Library(__dirname + 'dllFile', {
    //函数名
    'fun': ['int', ['string', 'string']]
});

//调用
var str1="a";
var str2="b";
libm.fun(str1, str2);

于是乎按照网上的案例 一顿操作, 结果怎么都过不去 !!!

原因是: ffi 因版本太长时间未更新, 只能支持 nodejs V12 以前的版本

(截至今日 2021年5月10日 是不行的, 以后万一作者更新了呢? )

如果你装的是 V12及更高版本的NodeJS, 一定失败 , 会遇到一堆 v8.h 找不到啊 / 函数不接受 0 个参数 啊 等等问题. ( 除非你本身是C++高手, 修改 ffi 的 c 代码 )

解决办法 : 使用 ffi-napi

npm install ffi-napi 
var ffi = require('ffi-napi');

//第一个形参为dll所在位置(dll文件可以不用加.dll),第二个为函数信息
var libm = ffi.Library(__dirname + 'dllFile', {
    //函数名
    'fun': ['int', ['string', 'string']]
});

//调用
var str1="a";
var str2="b";
libm.fun(str1, str2);

如果编译中遇到 类似下面的问题,

node-gyp\Cache\12.22.1\ia32\node.lib : fatal error LNK1106: 文件无效或磁盘已满: 无法查找到 0x2EB770

删除目录 C:\Users\Administrater\AppData\Local\node-gyp\Cache\12.22.1 (对应你的nodejs版本)

重新编译时 会 重新下载 头文件 和 库文件.

编程&开发
备案号:陕ICP备16003225号-1