未定义带有C共享库的ffi Node.js中的符号 - libmodbus

时间:2014-10-13 13:34:55

标签: c node.js shared-libraries modbus

我的计划: 使用libmodbus在C中创建共享库。使用node.js(ffi)访问此库。

这是C库:

#include <modbus.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

extern int read(void);

int main(void)
{
        int i=0;
        printf("starte\n");
        i = read();
        return i;
}

extern int read(void)
{
        modbus_t *ctx;
        uint16_t tab_reg[32];
        int anzahl = 1;
        int rc;

        ctx = modbus_new_tcp("10.69.69.103",502);
        modbus_set_slave(ctx, 180);

        if(modbus_connect(ctx) == -1)
        {
                modbus_free(ctx);
                return -1;
        }

        rc = modbus_read_input_registers(ctx, 100, anzahl, tab_reg);

        if (rc == -1)
        {
                modbus_free(ctx);
                return -1;
        }

        printf("Reg: %d\n", tab_reg[0]);
        return tab_reg[0];
}

如果我编译并运行它,它就可以工作。

然后我正在创建一个共享库:

gcc -c -Wall -Werror -fPIC modtest.c -I/usr/local/include/modbus/ -L/usr/lib/ -lmodbus

我得到了目标文件,我创建了共享对象

gcc -shared -o libmodtest.so modtest.o

获得.so文件后,我将其复制到usr / lib /并赋予它权限(chmod 0755)并使用ldconfig加载它。

现在我想使用Node.js和ffi模块访问此库:

var ffi = require('ffi');

var libmod = ffi.Library('libmodtest', {
        'read': ['int', [ 'void'] ]

});


var cb = libmod.read();
console.log(cb);

但是如果我运行它我会收到错误:

/home/frala/tmp/node_modules/ffi/lib/dynamic_library.js:74
    throw new Error('Dynamic Linking Error: ' + err)
          ^
Error: Dynamic Linking Error: /usr/lib/libmodtest.so: undefined symbol: modbus_connect
    at new DynamicLibrary (/home/frala/tmp/node_modules/ffi/lib/dynamic_library.js:74:11)
    at Object.Library (/home/frala/tmp/node_modules/ffi/lib/library.js:45:12)
    at Object.<anonymous> (/home/frala/tmp/test/modtest.js:4:18)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3

我还没有知道出了什么问题。

如果我使用&#34; nm&#34;来搜索符号我得到了:

000006a8 T main
         U modbus_connect
         U modbus_free
         U modbus_new_tcp
         U modbus_read_input_registers
         U modbus_set_slave
         U printf@@GLIBC_2.4
         U puts@@GLIBC_2.4
000006d0 T read
00000608 t register_tm_clones
0000904c d __TMC_END__

所以我猜U代表未定义。我如何定义它?

在Ubuntu 13.10上运行,俏皮

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题,我通过在链接标志周围添加-Wl, - whole-archive / no-whole-archive标签解决了这个问题。显然,这可以确保整个存档(库)存储在您的共享库中并使其可访问。

所以你可能想尝试:

gcc -c -Wall -Werror -fPIC modtest.c -I / usr / local / include / modbus / -L / usr / lib / -Wl, - whole-archive -lmodbus -Wl, - no-全档案