代码之家  ›  专栏  ›  技术社区  ›  PPP

节点ffi为C函数引发“undefined symbol”错误

  •  1
  • PPP  · 技术社区  · 8 年前

    我想用 redir 在NodeJs中使用节点ffi。

    这是我的 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 因为节点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\u init ?

    更新:

    我尝试将其专门编译到共享库中:

    gcc -shared -fpic redir.c -o libredir.so
    

    但是找不到 target\u init 持续存在

    1 回复  |  直到 8 年前
        1
  •  0
  •   PPP    8 年前

    解决方案:删除 static 函数中的关键字:)