前言
最近接了個任務,需要把代碼移植到armv7平台,搜尋相關方法,了解到可以利用交叉編譯工具如:gcc-linaro-arm-linux-gnueabihf。把自己依賴的第三方庫代碼和自己代碼分別編譯就好。后來公司買了個樹莓派,我直接在樹莓派上編代碼了,過程中沒有很大的問題,記錄下。
我代碼確實依賴了不可移植的如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引起的,編譯階段問題不好預估和自己代碼有關,遇到了及時解決就行。
運行