Yocto项目qemux86-64架构下openblas.bb的do_compile任务报错退出码1
报错原因
- 核心是交叉编译场景下的测试执行冲突:OpenBLAS默认编译流程会在库编译完成后自动构建并运行测试用例,你当前是Yocto交叉编译环境,编译出的
sblat1等测试用例是qemux86-64目标架构的二进制文件,无法直接在构建主机上运行。shell提示的./sblat1: not found不是文件真的不存在,是主机内核无法识别目标架构的可执行文件格式,执行失败后返回的误导性提示。 - 你当前的openblas.bb配方没有传递禁用测试的参数给OpenBLAS的Makefile,导致默认触发了测试执行步骤,最终编译失败。
修复方案
只需要修改openblas.bb的do_compile步骤,添加OpenBLAS原生支持的禁用测试参数NO_TESTS=1即可,修改后的do_compile代码如下:
do_compile () { oe_runmake HOSTCC="${BUILD_CC}" \ CC="${TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS} ${@map_extra_options(d.getVar('TARGET_ARCH'), d)}" \ CF="${TARGET_PREFIX}gfortran ${TOOLCHAIN_OPTIONS} ${@map_extra_options(d.getVar('TARGET_ARCH'), d)}" \ PREFIX=${exec_prefix} \ CROSS_SUFFIX=${HOST_PREFIX} \ BINARY='${@map_bits(d.getVar('TARGET_ARCH'), d)}' \ TARGET='${@map_arch(d.getVar('TARGET_ARCH'), d)}' \ NO_TESTS=1 }
(可选优化)如果你的qemux86-64需要更高的性能,可以调整map_arch函数中x86_64对应的目标架构,默认返回的ATOM是针对低功耗凌动架构的优化,通用x86_64场景可以换成HASWELL或者更通用的x86_64,不调整也可以正常运行。
修改完成后重新执行openblas的构建任务即可正常编译通过。
内容的提问来源于stack exchange,提问作者A.A.
相关产品推荐
相关产品推荐

