编译ejabberd-18.01自定义模块报错:undefined parse transform 'lager_transform'
解决
undefined parse transform 'lager_transform'编译错误(ejabberd-18.01 + OTP 20) 针对你在编译ejabberd自定义模块时反复遇到的这个错误,结合你使用的ejabberd-18.01和OTP20版本,我整理了几个针对性的排查和解决步骤:
确认Lager依赖的引入与路径配置
首先得确保你的自定义模块能正确找到Lager库:- 如果用Rebar编译,检查
rebar.config里是否声明了Lager依赖,版本要和ejabberd-18.01兼容(ejabberd 18.01对应的Lager版本通常是3.2.x,你可以查看ejabberd源码里的rebar.lock确认具体版本),比如:{deps, [ {lager, "3.2.1"} ]}. - 如果是用Makefile编译,要在编译参数里加入Lager的ebin路径,比如在
ERL_FLAGS中添加-pa /path/to/ejabberd/deps/lager/ebin,或者设置环境变量export ERL_LIBS=/path/to/ejabberd/deps:$ERL_LIBS,让Erlang能找到Lager的编译文件。
- 如果用Rebar编译,检查
检查Parse Transform的代码配置
- 确认你的模块代码顶部是否有
-compile({parse_transform, lager_transform}).这一行,如果有,必须保证编译时Lager的ebin目录在Erlang的代码搜索路径中;如果是通过Rebar管理,要在rebar.config的erl_opts里配置:{erl_opts, [{parse_transform, lager_transform}]}. - 注意:不要重复配置,要么在代码里加,要么在Rebar配置里加,避免冲突。
- 确认你的模块代码顶部是否有
清理编译缓存,重新编译
旧的编译缓存很可能导致依赖路径异常,先彻底清理:- 删除自定义模块目录下的
ebin文件夹、所有.beam文件; - 如果用Rebar,删除
_build和deps目录(如果是本地依赖的话),重新执行rebar get-deps && rebar compile; - 如果是ejabberd自带的模块编译流程,先进入ejabberd源码目录执行
make clean,再重新编译你的模块。
- 删除自定义模块目录下的
验证OTP20与Lager版本的兼容性
OTP20对Parse Transform的处理没有特殊限制,但要确保你使用的Lager版本是明确支持OTP20的——Lager 3.2.x系列是完全兼容的,避免使用太旧(比如3.0以下)或太新的版本,防止出现兼容性问题。检查ejabberd编译环境的完整性
如果你是在ejabberd源码目录下编译自定义模块,必须确保ejabberd本身已经编译完成,其依赖(包括Lager)都已经正确安装到deps目录中。编译模块时,可以先执行:export ERL_LIBS=$(pwd)/deps:$ERL_LIBS再执行模块的编译命令,确保Erlang能加载到ejabberd的所有依赖库。
内容的提问来源于stack exchange,提问作者Prakash
相关产品推荐
相关产品推荐

