Ubuntu20.04编译带FIPS的RabbitMQ时找不到eunit.hrl的问题
解决编译RabbitMQ时找不到eunit/include/eunit.hrl的问题
问题根源
你从源码编译的Erlang大概率缺少eunit组件——eunit是Erlang/OTP的测试框架组件,RabbitMQ的依赖编译必须用到它。默认情况下Erlang编译会包含eunit,但如果编译时系统依赖缺失或配置选项做了限制,就可能跳过该组件的编译。
解决步骤
1. 验证Erlang是否已安装eunit
先检查你的Erlang安装目录下是否存在eunit库:
ls /usr/local/lib/erlang/lib | grep eunit # 查看是否有类似 eunit-2.7.0 这样的目录 ls /usr/local/lib/erlang/lib/eunit-*/include/eunit.hrl
如果没有输出或提示文件不存在,说明你的Erlang确实没编译eunit,需要重新编译Erlang。
2. 重新编译带eunit的Erlang(保留FIPS支持)
进入之前的Erlang源码目录,重新执行编译流程,确保没有禁用eunit的配置:
# 清理之前的编译产物 make clean # 重新配置,保留--enable-fips,默认启用eunit(无需额外指定,除非之前用了禁用选项) ./configure --enable-fips --prefix=/usr/local # 编译并安装 make -j$(nproc) sudo make install
注意:确保Ubuntu系统已安装Erlang编译的所有依赖,比如
build-essential、libssl-dev、libncurses-dev等,缺失依赖可能导致组件编译失败。
3. 确认Erlang环境路径正确
确保系统优先使用你编译的Erlang,而非系统默认版本:
# 检查erl命令路径 which erl # 应输出 /usr/local/bin/erl # 验证eunit是否能被Erlang找到 erl -eval 'io:format("~p~n", [code:lib_dir(eunit)]).' -s init stop
如果命令返回eunit的安装路径,说明环境配置正确。
4. 重新编译RabbitMQ-server
回到RabbitMQ源码目录,清理之前的编译缓存后重新编译:
make clean make
额外排查点
- 如果重新编译Erlang后仍找不到eunit,检查编译日志中是否有关于eunit的错误信息,排查是否有依赖缺失导致编译失败。
- 若ERL_LIBS变量已设置,确保其值包含
/usr/local/lib/erlang/lib,不过正确安装的Erlang会自动识别这个路径,通常无需额外设置。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

