記一次程序從x86_64linux平台移植到armv7平台


前言

最近接了個任務,需要把代碼移植到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庫里邊崩潰,聯想到版本問題,后來重新編其它版本,代碼正常運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM