我尝试使用node-ffi在NodeJ中使用redir。
这是我的redir.js
:
const ref = require('ref');
const ffi = require('ffi');
const Struct = require('ref-struct');
const struct_in_addr = Struct({
's_addr': 'unsigned long',
});
const struct_sockaddr_in = Struct({
'sin_family': 'short',
'sin_port' : 'u_short',
'in_addr' : struct_in_addr,
'sin_zero' : 'char',
});
var redir = ffi.Library('./redir', {
'target_init' : [ 'int', [ 'char *', 'int', [ struct_sockaddr_in, "pointer" ]] ],
'target_connect': [ 'int', [ 'int', [ struct_sockaddr_in, "pointer" ] ] ],
'client_accept' : [ 'int', [ 'int', [ struct_sockaddr_in, "pointer" ] ] ],
'server_socket' : [ 'int', [ 'char *', 'int', 'int' ] ],
});
我通过执行./autogen.sh && ./configure && ./make
编译并生成redir
可执行文件。我必须将其重命名为redir.so
,因为node-ffi一直将.so
放在文件的末尾
这是我在node redir.js
时得到的结果:
Error: Dynamic Symbol Retrieval Error: ./redir.so: undefined symbol: target_init
at DynamicLibrary.get (/home/lz/redir-controller/node_modules/ffi/lib/dynamic_library.js:112:11)
无法找到target_init
功能。我相信我做的一切都很好。它可能是函数签名错误(我使用了错误的类型),或者它是否真的没有名为target_init
的函数?
更新
我尝试将其专门编译到共享库中:
gcc -shared -fpic redir.c -o libredir.so
但未找到target_init
的问题仍然存在
答案 0 :(得分:0)
解决方案:从函数中删除static
个关键字:)