我的计划: 使用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上运行,俏皮
答案 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-全档案