Buildroot编译scikit-learn遇BLAS/LAPACK缺失及test_program找不到求助
Buildroot编译scikit-learn/scipy相关问题解答
问题背景
在Buildroot中添加scikit-learn包时,编译阶段发现依赖scipy,于是在python-scipy.mk中添加以下host-python-scipy依赖项:
HOST_PYTHON_SCIPY_DEPENDENCIES += \ host-python-numpy \ host-python-pythran \ zlib \ lapack \ python-numpy \ python-pybind
重新编译scikit-learn时出现numpy.distutils.system_info.NotFoundError: No BLAS/LAPACK libraries found错误,日志显示无法找到armpl_lp64_mp、mkl_rt、openblas等库;后续操作后又遇到FileNotFoundError: [Errno 2] No such file or directory: './test_program'错误,报错指向package/pkg-generic.mk。
一、Buildroot对MKL库的支持及添加方法
- Buildroot默认不提供Intel MKL库:MKL是闭源商业库,仅针对x86架构做深度优化,多数嵌入式架构(如ARM)无法直接适配,因此Buildroot官方未集成该库。
- 替代解决方案:使用Buildroot自带的开源BLAS/LAPACK实现OpenBLAS,适配绝大多数架构:
- 启用OpenBLAS:运行
make menuconfig,进入Libraries > Math,勾选openblas选项。 - 修正依赖配置:修改
python-scipy.mk中的HOST_PYTHON_SCIPY_DEPENDENCIES,将lapack替换为host-openblas和openblas;同时在python-numpy.mk中添加DEPENDENCIES += openblas,确保numpy关联OpenBLAS。 - 重新编译:执行
make host-python-scipy clean && make,触发依赖重新编译。
- 启用OpenBLAS:运行
二、pkg-generic.mk的作用
pkg-generic.mk是Buildroot的核心通用包编译框架,所有遵循标准流程编译的包都会引用该文件。- 它定义了包编译的全生命周期标准步骤:下载、解压、配置、编译、安装、测试等通用逻辑,负责处理环境变量传递、目录创建、错误检查、权限管理等基础编译工作。
- 报错指向该文件,说明测试阶段(由pkg-generic.mk定义的通用测试流程)执行时,找不到指定的测试程序文件。
三、解决test_program找不到且不跳过测试的方法
- 核心原因:交叉编译环境下,测试脚本生成的测试程序路径异常,或交叉编译的测试程序无法直接在主机(x86架构)运行(目标为ARM等架构)。
- 具体解决步骤:
- 核对测试程序生成路径:查看编译日志中的测试程序生成命令,确认
./test_program是否应在当前编译目录生成。若路径错误,可在包的.mk文件中添加MAKE_FLAGS或CONFIGURE_FLAGS指定正确输出路径。 - 用QEMU模拟目标架构运行测试:在Buildroot配置中启用
BR2_PACKAGE_HOST_QEMU,然后在包的.mk文件中添加TEST_ENV += QEMU=$(HOST_DIR)/usr/bin/qemu-arm(根据目标架构调整为qemu-aarch64等),让测试阶段通过QEMU模拟执行交叉编译的测试程序。 - 确保依赖与编译参数完整:确认pythran、pybind、OpenBLAS等依赖已正确安装,且编译时的
CFLAGS、LDFLAGS正确传递库路径,例如添加LDFLAGS += -L$(STAGING_DIR)/usr/lib到包的编译配置中。
- 核对测试程序生成路径:查看编译日志中的测试程序生成命令,确认
内容的提问来源于stack exchange,提问作者kinder chen
相关产品推荐
相关产品推荐

