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;
}
这将解决错误。
我正在尝试使用 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;
}
这将解决错误。