首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有C共享库的ffi Node.js中未定义的符号- libmodbus

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

Stack Overflow用户
提问于 2014-10-13 21:34:55
回答 1查看 811关注 0票数 1

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

这是C库:

代码语言:javascript
复制
#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];
}

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

然后,我将从中创建一个共享库:

代码语言:javascript
复制
gcc -c -Wall -Werror -fPIC modtest.c -I/usr/local/include/modbus/ -L/usr/lib/ -lmodbus

在那里,我获得了对象文件,并创建了共享对象

代码语言:javascript
复制
gcc -shared -o libmodtest.so modtest.o

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

现在我想通过Node.js和ffi模块访问这个库:

代码语言:javascript
复制
var ffi = require('ffi');

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

});


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

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

代码语言:javascript
复制
/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

我不知道出了什么问题。

如果我用"nm“搜索符号,得到的结果是:

代码语言:javascript
复制
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上,saucy

EN

回答 1

Stack Overflow用户

发布于 2014-11-01 03:36:05

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

所以你可能想试试:

全档案库-c -Wall -Werror -fPIC modtest.c -i/usr/-fPIC/include/modbus/ -L/usr/lib/ -Wl,-Werror--fPIC -lmodbus -Wl,--no--Wl archive

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26341311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档