记一次程序从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库里边崩溃,联想到版本问题,后来重新编其它版本,代码正常运行。
记一次程序从x86_64linux平台移植到armv7平台的更多相关文章
- net-snmp5.7.3移植到arm-linux平台
net-snmp5.7.3移植到arm-linux平台 本次交叉编译在ubuntu 15.04 64位系统下进行. 准备工作 在编译移植前有几项准备工作需要完成. 1下载net-snmp 5.7.3源 ...
- MIPS平台移植apache 2.2.7
参考文章: http://wenku.baidu.com/view/94e08a20a5e9856a561260e2.html http://httpd.apache.org/docs/2.4/ins ...
- Windows下将ImageMagick移植到Android平台
Windows下将ImageMagick移植到Android平台 原文链接 http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...
- 只能用Android studio做平台移植了! 在Windows10下, 开发Android。
安装好IDE后, 会一直显示同步失败, 看看如下步骤: 需要注意的是: -> 安装NDK 自带的NDK版本有问题 自己去下一个15版本的 -> 按照系统提示一步一步安装其他 ...
- php平台移植windows和linux
2015/1/14 今天项目中遇到一个问题,在本地运行没有问题,挂到服务器上,就运行错误.过程中比较粗心,知道导致这样的原因,居然小时漏掉了一些细节. 比如,在php中通过声明__autoload() ...
- FFmpeg的Android平台移植—编译篇
摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程. 环境准备: ubuntu-12.04.5 android-ndk64-r10-linux-x86_64. ...
- 基于Cocos2d-x-1.0.1的飞机大战游戏迁移到Cocos2d-x-3.0版本,并移植到Android平台成功运行
一.版本迁移中的问题 1.游戏元素Sprite.Label.Action等等的创建函数名都改为create. 2.函数的回调callfunc_selectorcallfuncN_selectorcal ...
- QT4.8.5环境移植到嵌入式平台
QT4.8.5环境移植到嵌入式平台 参考:Qt移植到ARM Linux教程 http://www.veryarm.com/930.html 清除配置: sudo make confclean 配置: ...
- J2ME项目移植到Android平台六大注意事项
很多J2ME项目如何移植到Android平台呢?Java虽然号称是跨平台应用但是目前的移植问题还是比较严重的,不知道未来Sun推出JavaFx或F3时会出现什么问题,如何从J2ME移植到Android ...
随机推荐
- yiele函数
1.概念: 当调用Thread.yield()函数时,会给线程调度器一个当前线程愿意让出CPU使用的暗示,但是线程调度器可能会忽略这个暗示. 2.实战. 看下面例子 public class yiel ...
- [JZOJ6244]【NOI2019模拟2019.7.1】Trominoes 【计数】
Description n,m<=10000 Solution 考虑暴力轮廓线DP,按顺序放骨牌 显然轮廓线长度为N+M 轮廓线也是单调的 1表示向上,0表示向右 N个1,M个0 只能放四种骨牌 ...
- 【杂题】[LibreOJ #6608] 无意识的石子堆【容斥原理】【FFT】
Description Solution 943718401=225*2^22+1 显然每行必须有两个,我们不妨枚举有k列有2个石子,那么有2(n-k)列有1个石子. \[Ans=\sum\limit ...
- 第一次的迷宫为队列版,这个为搜索版x(自己写的嘿嘿)
错误原因:第一次提交的时候把Yes跟No输错了都输为大写:…… 代码来啦! #include<cstdio> #include<iostream> using namespac ...
- flink⼿手动维护kafka偏移量量
flink对接kafka,官方模式方式是自动维护偏移量 但并没有考虑到flink消费kafka过程中,如果出现进程中断后的事情! 如果此时,进程中段: 1:数据可能丢失 从获取了了数据,但是在执⾏行行 ...
- sklearn.model_selection Part 2: Model validation
1. check_cv() def check_cv(cv=3, y=None, classifier=False): if cv is None: cv = 3 if isinstance(cv, ...
- Js基础知识(一) - 变量
js基础 - 变量 *大家对js一定不会陌生,入门很简单(普通入门),很多人通过网络资源.书籍.课堂等很多途径学习js,但是有些js基础的只是往往被大家遗漏,本章就从js变量类型来说一说js 变量类型 ...
- Javascript事件:this.value()和this.select()
1.JavaScript的this.value() <asp:TextBox ID="txtComment" runat="server" Text=&q ...
- 教材代码完成情况测试P186(课上测试)
一.任务详情 0 在Ubuntu中用自己的有位学号建一个文件,教材p186 Example8_8 1.修改p186 Example8_8中代码,密钥password不用手动输入,使用Random产生随 ...
- zeppelin安装使用
官网:http://zeppelin-project.org/ 代码:https://github.com/NFLabs/zeppelin 使用:按照官网的视频操作一遍,应该就懂了http://y ...