Erlang自定义驱动driverc.c编译出现未定义符号错误如何解决?
Erlang驱动编译报错解决方法
1 先修正代码笔误
你提供的C代码存在两处语法错误,需要先修正再编译:
- control函数定义的第二个参数拼写错误:将
insigned int command修改为unsigned int command - control函数定义的第五个参数名和声明不一致:将
char **buf修改为char **rbuf
2 修正编译命令
你当前使用的编译命令是按照普通可执行C程序的逻辑编写的,不符合Erlang驱动的编译规则,报错原因如下:
- 未添加动态库编译参数:Erlang驱动属于动态链接库,不需要main函数作为入口,默认编译可执行程序会强制校验main函数,因此会报
undefined symbol: main错误 - 未链接Erlang官方依赖库:
driver_alloc、set_port_control_flags属于Erlang驱动运行库的API,ei_encode_long属于Erlang ei编码库的API,编译时未显式链接这两个库就会报符号未定义错误
Linux平台正确编译命令
cc -fPIC -shared driverc.c -I/usr/local/lib/erlang/usr/include -L/usr/local/lib/erlang/usr/lib -lerl_driver -lei -o driverc.so
macOS平台正确编译命令
cc -fPIC -dynamiclib driverc.c -I/usr/local/lib/erlang/usr/include -L/usr/local/lib/erlang/usr/lib -lerl_driver -lei -o driverc.so
参数说明:
-fPIC:生成位置无关代码,满足动态链接库的运行要求-shared(Linux)/-dynamiclib(macOS):指定编译器生成动态链接库,而非可执行程序-L:指定Erlang依赖库的搜索路径,请根据你实际的Erlang安装路径调整,若你是通过系统包管理器安装的Erlang,路径通常为/usr/lib/erlang/usr/lib-lerl_driver:链接Erlang驱动运行库-lei:链接Erlang ei编码库
编译成功后会生成driverc.so文件,你可以在Erlang代码中通过erlang:open_port/2接口加载该驱动使用。
内容的提问来源于stack exchange,提问作者Abdelghani
相关产品推荐
相关产品推荐

