手动编译Erlang默认inet_drv.c驱动出现报错的原因是什么
编译失败的核心原因
你参照的是外部自定义Erlang驱动的编译流程,但inet_drv.c是ERTS内置的核心驱动,完全不适用该流程,具体问题如下:
- 它不是独立的动态加载模块:ERTS不会在启动时单独编译它,而是直接把它和虚拟机本体静态编译、链接到一起,和第三方外部驱动的运行逻辑完全不同。
- 缺少必要的编译参数和预定义宏:你只补全了头文件路径,但ERTS编译该驱动时会传入大量平台专属的预编译宏、编译选项,比如FreeBSD平台的系统特性开关、OTP版本适配宏、
-fPIC等位置无关代码编译参数,这些缺失后就会出现各类未定义声明、类型不匹配的报错。 - 依赖虚拟机私有API:
inet_drv.c调用了大量ERTS内部不对外暴露的私有接口,这些接口不会开放给外部动态加载的驱动,哪怕你编译通过,也无法通过erl_ddll模块正常加载运行。
后续建议
- 如果是为了学习Erlang驱动开发,直接参考Erlang官方文档提供的外部驱动样例代码走标准流程即可,不要拿ERTS内置核心驱动做测试。
- 如果要研究
inet_drv的编译逻辑,直接查看OTP源码中ERTS目录下的Makefile,复用官方预定义的编译参数,不要手动凑头文件路径。
内容的提问来源于stack exchange,提问作者Abdelghani
相关产品推荐
相关产品推荐

