Ubuntu 14.04编译Erlang代码报错:type ip_address()/ip_port()未定义
解决Ubuntu 14.04编译Erlang时
ip_address()/ip_port()类型未定义的问题 这种问题我之前维护老项目时碰到过,核心原因基本和Erlang版本与系统的适配有关——尤其是Ubuntu 14.04这种偏老的发行版,自带的Erlang版本大概率不支持这两个新类型。下面给你几个可行的解决方向:
先确认Erlang版本
打开终端输入erl -version查看当前版本。ip_address()和ip_port()是Erlang/OTP 18.0之后才在kernel/include/inet.hrl里正式标准化的类型,如果你的版本低于18.0(比如Ubuntu 14.04默认的R16B系列),那肯定会报这个错。手动补全类型定义(应急方案)
如果暂时没法升级Erlang,可以在你的代码模块最开头手动添加这两个类型的定义,绕过编译报错:% 直接复用inet模块的底层类型定义 -type ip_address() :: inet:ip_address(). -type ip_port() :: inet:port_number().或者更直白地用原始类型替代:
-type ip_address() :: tuple() | string(). % 对应IPv4元组或IPv6字符串/元组 -type ip_port() :: integer(). % 端口号范围0-65535升级Erlang版本(长期解决方案)
如果系统允许,建议直接升级到支持这两个类型的Erlang版本。可以用Erlang Solutions的源来安装,步骤如下:# 添加Erlang Solutions的软件源 wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb sudo dpkg -i erlang-solutions_1.0_all.deb # 更新缓存并安装新版Erlang sudo apt-get update sudo apt-get install erlang安装完成后再用
erl -version确认版本是否在18.0以上。检查头文件引用是否正确
最后再确认你的代码里有没有正确引入inet.hrl,模块开头需要加:-include_lib("kernel/include/inet.hrl").不过要注意,旧版本Erlang的这个头文件里确实没有这两个类型,所以如果版本不够,光引用也没用,还是得结合前面的方案。
内容的提问来源于stack exchange,提问作者Hao Li
相关产品推荐
相关产品推荐

