ejabberd 24.06编译依赖报错及make无编译文件名输出求助
问题1:ejabberd 24.06依赖编译时rebar抛出function_clause错误
错误原因
错误源于override_deps_versions2插件的逻辑缺陷,第14行的函数无法处理[{unicode_util_compat,"~>0.7.0"}]这种参数结构,触发了Erlang的函数子句不匹配错误。结合前置版本警告,推测是插件在处理版本约束时,对参数格式的预期与实际传入内容不匹配。
解决方法
- 临时绕过插件:打开
ejabberd-src/rebar.config,找到加载override_deps_versions2插件的配置行并注释,之后重新执行./rebar compile。 - 修复插件代码:编辑
ejabberd-src/plugins/override_deps_versions2.erl第14行的update_deps函数,调整lists.map的处理逻辑,确保能正确接收[{Name, Version}]格式的参数。示例修改:update_deps(Deps) -> lists:map(fun({DepName, DepVersion}) -> % 保留原有版本覆盖逻辑 {DepName, DepVersion} end, Deps). - 切换官方推荐构建工具:ejabberd 24.06已默认使用Mix构建,直接执行
mix compile替代./rebar compile,可规避插件兼容性问题。
问题2:ejabberd 24.06执行make时不输出具体编译文件名
原因
ejabberd 24.06采用Mix作为默认构建工具,而ejabberd 21使用的是Rebar。Mix的compile命令默认输出风格简洁,仅显示编译文件数量;Rebar的编译逻辑则默认会输出每个编译文件的具体路径。
解决方法
- 手动启用详细输出:执行
mix compile --verbose,即可查看具体编译的每个文件名。 - 修改Makefile永久生效:打开源码根目录的
Makefile,找到调用mix compile的行,修改为mix compile --verbose,后续执行make时将自动输出详细编译信息。
内容的提问来源于stack exchange,提问作者iPPLE
相关产品推荐
相关产品推荐

