天天看点

记一次程序从x86_64linux平台移植到armv7平台

记一次程序从x86_64linux平台移植到armv7平台

Posted on 2019-07-05 17:11 _hao 阅读(...) 评论(...) 编辑 收藏

前言

最近接了个任务,需要把代码移植到armv7平台,搜寻相关方法,了解到可以利用交叉编译工具如:gcc-linaro-arm-linux-gnueabihf。把自己依赖的第三方库代码和自己代码分别编译就好。后来公司买了个树莓派,我直接在树莓派上编代码了,过程中没有很大的问题,记录下。

1.确定第三方依赖库是否可以移植

我代码确实依赖了不可移植的如mkl库,这是intel相关的,所以移植到arm肯定不行,于是换kaldi支持的另一种库,openblas。先替换然后让代码正常调用openblas。

2. 编译依赖的第三方库源码

我这边依赖了4个库:openfst openblas silk crfpp

  • openfst,crfpp:编译起来很方便,没啥特殊,和其它平台编一样,唯一错误好像crfpp没指定-fPIC。
  • openblas:这个需要指定指令架构和gfortran编译器,第一次我没指定gfortran虽然也编完了,但是实际它没编lapack和blas,后来编译命令是这样:
          make TARGET=ARMV7 FC=arm-linux-gnueabihf-gfortran

    注:默认树莓派没装这个gfortran 这个需要自己装的gfortran。

  • silk 安装也需要指定指令集和cpu如下
    make clean all TARGET_CPU=Cortex-A53 TARGET_ARCH=armv7
    注:对于编依赖库都是跟着readme来的,幸好这些依赖库都支持跨平台编译

3. 编译运行自己代码

编译

这些库装完,接下来就是编译自己代码,我这边编译只遇到了一些头文件缺失问题,比如silk在arm平台需要多加相应头文件,再如链接缺失问题,类似gfortran选项,这是因为项目换用openblas引起的,编译阶段问题不好预估和自己代码有关,遇到了及时解决就行。

运行

编完就知道不会这么顺利,果然运行出现问题-段错误。这时候不要慌,gdb调试下,我遇到这个段错误当时查看调用栈信息时刚开始由于多线程看不出来,后来改成非线程调用可以清楚看到执行到openfst库里边崩溃,联想到版本问题,后来重新编其它版本,代码正常运行。