Error: Dynamic Symbol Retrieval Error: ./build/Release/obj.target/math.so: undefined symbol: add . Node-ffi on linux system

Error: Dynamic Symbol Retrieval Error: ./build/Release/obj.target/math.so: undefined symbol: add . Node-ffi on linux system

我正在尝试使用 node-ffi 访问 cpp 库并使用这些函数。 math.cc 是包含所有函数定义的 cc 文件。使用 node-gyp 构建代码。并生成由 math.js.

访问的 .so 文件

math.cc

#include "math.h"

int add(int x, int y)
{
  return x + y;
}

int minus(int x, int y)
{
  return x - y;
}

int multiply(int x, int y)
{
  return x * y;
}

头文件

int add(int a, int b);
int minus(int a, int b);
int multiply(int a, int b);

math.js 导出函数

var ffi = require('ffi');
var ref = require('ref');
var int = ref.types.int;

var platform = process.platform;
var mathlibLoc = null;

if (platform === 'win32'){
    mathlibLoc = './math.dll';
}else if(platform === 'linux'){
    mathlibLoc = './build/Release/obj.target/math.so';
}else if(platform === 'darwin'){
    mathlibLoc = './math.dylib'
}else{
    throw new Error('unsupported plateform for mathlibLoc')
}

var math = ffi.Library(mathlibLoc, {
    "add": [int, [int, int]],
    "minus": [int, [int, int]],
    "multiply": [int, [int, int]]
});

module.exports = math;

访问函数

test.js

var math = require('./math');
var result = null;

result = math.add(5, 2);
console.log('5+2='+result);

result = math.minus(5, 2);
console.log('5-2='+result);

result = math.multiply(5, 2);
console.log('5*2='+result);

报错。请帮忙。

由于代码在cpp中,如果我们想访问node-ffi中的cpp库,我们需要执行extern "C"。

#include <stdint.h>

#if defined(WIN32) || defined(_WIN32)
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif

extern "C" EXPORT int add(int a, int b) {
 return a + b;
}

这将解决错误。