记一次程序从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库里边崩溃,联想到版本问题,后来重新编其它版本,代码正常运行。
最新文章
- Django中Celery的实现介绍(一)
- hdoj 1874 畅通工程续
- 通过自定义属性存储数据实现输入框获得焦点与失去焦点改变value值
- 基本Linux命令总结
- Listen第二个参数的意义
- table中超长字符串省略号表示两种方法
- win10锁屏壁纸路径
- 浅谈聚类算法(K-means)
- Django 视图层
- Python_检查程序规范
- springboot 与任务
- 将MD5值压缩成8位32进制生成8位长度的唯一英文数字组合字符串
- 微信小程序中显示与隐藏(hidden)
- Java客户端连接kafka集群报错
- LaTeX语法笔记
- char和varchar、浮点数和定点数
- ./configure: error: the HTTP rewrite module requires the PCRE library解决
- 【算法】BFS+哈希解决八数码问题
- LightOJ 1030 - Discovering Gold - [概率DP]
- GIT(1)----更新代码和上传代码操作的步骤