本人在编译aarch64版本的 CLblast的时候需要依赖一版aarch64版本的blas库,所以就尝试用openblas。在编译的过程中踩了不少坑,遇到了不少麻烦,这里记录下成功的过程步骤,供大家参考。
1、安装交叉编译工具链
apt-get install gcc-aarch64-linux-gnu -y
apt-get install g++-aarch64-linux-gnu -y
apt-get install gfortran-aarch64-linux-gnu -y
安装完成后,可以通过下面两个命令查看版本,以验证是否安装成功:
aarch64-linux-gnu-gcc -v
aarch64-linux-gnu-gfortran -v
2、下载openblas源代码
源代码的地址是:https://github.com/xianyi/OpenBLAS/
git clone https://github.com/xianyi/OpenBLAS.git
这里默认下载的是develop分支的代码,如果想要下载release版本的 ,可以通过tag进行切换
3、编译openblas源码
cd OpenBLAS;
如果是编译x86_64版本的,就比较简单,执行:make FC=gfortran 即可
如果是编译aarch64版本,执行命令:make TARGET=ARMV8 HOSTCC=gcc BINARY=64 CC=aarch64-linux-gnu-gcc FC=aarch64-linux-gnu-gfortran
TARGET参数就是用来设置编译版本的。在OpenBLAS目录下有个TargetList.txt文档,里面写了支持的编译对象。
vi TargetList.txt
如果没有什么问题,编译成功会有以下截图类似的打印日志:
4、安装
可以通过命令make PREFIX=/path/to/your/installation install,将编译的结果安装到固定目录.会生成下面3个目录:
5、遇到的问题
因为我最终的目的是编译CLBlast,需要依赖libopenblas.so*,在链接到这个so的时候,会报说openblas依赖的libgfortran.so.5有未定义符号,例如:
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libgfortran.so.5: undefined reference to `fstat@GLIBC_2.33'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libopenblas.so: undefined reference to `pthread_join@GLIBC_2.34'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libgfortran.so.5: undefined reference to `lstat@GLIBC_2.33'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libgfortran.so.5: undefined reference to `stat@GLIBC_2.33'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libopenblas.so: undefined reference to `pthread_setaffinity_np@GLIBC_2.34'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libopenblas.so: undefined reference to `pthread_create@GLIBC_2.34'
造成这个问题的原因在于:我在最开始编译openblas的时候使用的交叉编译工具链并不是apt安装的,而是下载的tar包解压后配置环境变量后使用的。但是后面在编译CLBLAST的时候,我在编译脚本中又写了apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu -y ,这就导致前后使用的交叉编译工具链不一致。但是奇怪的是我后来有尝试将apt安装的都卸载,只使用tar包的那一版,却依旧是有问题的。后来我删除了tar包的PATH和LD_LIBRARY_PATH环境变量,只使用apt安装的交叉工具编译链,重新编译了openblas之后再重新编译CLBlast的代码就ok了。
以上内容如有不对之处,烦请大家多多指教。