前言

最近接了个任务,需要把代码移植到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平台的更多相关文章

  1. net-snmp5.7.3移植到arm-linux平台

    net-snmp5.7.3移植到arm-linux平台 本次交叉编译在ubuntu 15.04 64位系统下进行. 准备工作 在编译移植前有几项准备工作需要完成. 1下载net-snmp 5.7.3源 ...

  2. MIPS平台移植apache 2.2.7

    参考文章: http://wenku.baidu.com/view/94e08a20a5e9856a561260e2.html http://httpd.apache.org/docs/2.4/ins ...

  3. Windows下将ImageMagick移植到Android平台

    Windows下将ImageMagick移植到Android平台 原文链接  http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...

  4. 只能用Android studio做平台移植了! 在Windows10下, 开发Android。

    安装好IDE后, 会一直显示同步失败, 看看如下步骤: 需要注意的是: -> 安装NDK      自带的NDK版本有问题    自己去下一个15版本的 -> 按照系统提示一步一步安装其他 ...

  5. php平台移植windows和linux

    2015/1/14 今天项目中遇到一个问题,在本地运行没有问题,挂到服务器上,就运行错误.过程中比较粗心,知道导致这样的原因,居然小时漏掉了一些细节. 比如,在php中通过声明__autoload() ...

  6. FFmpeg的Android平台移植—编译篇

    摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程. 环境准备: ubuntu-12.04.5 android-ndk64-r10-linux-x86_64. ...

  7. 基于Cocos2d-x-1.0.1的飞机大战游戏迁移到Cocos2d-x-3.0版本,并移植到Android平台成功运行

    一.版本迁移中的问题 1.游戏元素Sprite.Label.Action等等的创建函数名都改为create. 2.函数的回调callfunc_selectorcallfuncN_selectorcal ...

  8. QT4.8.5环境移植到嵌入式平台

    QT4.8.5环境移植到嵌入式平台 参考:Qt移植到ARM Linux教程 http://www.veryarm.com/930.html 清除配置: sudo make confclean 配置: ...

  9. J2ME项目移植到Android平台六大注意事项

    很多J2ME项目如何移植到Android平台呢?Java虽然号称是跨平台应用但是目前的移植问题还是比较严重的,不知道未来Sun推出JavaFx或F3时会出现什么问题,如何从J2ME移植到Android ...

随机推荐

  1. D. Tokitsukaze, CSL and Stone Game ( 取石子游戏?no,更像棋盘游戏 )

    去吧,皮皮虾 题意:  有 n 堆石子,每堆有 a[ i ] 个,然后每次 操作 可以选择任意一堆 石子,取走一个. 若你取完了之后,存在两堆石子,他们的个数一样多,你就输了( 包括两堆都是0个), ...

  2. UVA 11178 Morley's Theorem 计算几何模板

    题意:训练指南259页 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  3. maven安装问题解决

    出现: The JAVA_HOME environment variable is not defined correctly This environment variable is needed ...

  4. luoguP1041 传染病控制 x

    P1041 传染病控制 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染 ...

  5. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

  6. 分布式-信息方式-ActiveMQ基础

    ActiveMQ简介 ActiveMQ是什么ActiveMQ是Apache推出的,一款开源全支持JMS.1和J2EE1.4范的JMS Provider实现的信息中间件.(message oriente ...

  7. C++入门经典-例5.12-动态内存的销毁

    1:当申请一块堆内存后,系统不会再程序执行时一句情况自动销毁它.若想释放该内存,则需要使用delete关键字.下面的代码中,可以看出堆和栈的不同.代码如下: // 5.12.cpp : 定义控制台应用 ...

  8. Removing jQuery from GitHub.com frontend

    Removing jQuery from GitHub.com frontend Web standards in the later years Over the years, GitHub gre ...

  9. 一、基础篇--1.1Java基础-hashCode和equals方法的区别和联系

     hashCode和equals方法的区别和联系  两个方法的定义 equals(Object obj)方法用来判断两个对象是否"相同",如果"相同"则返回tr ...

  10. IDEA项目添加第三方依赖

    1.在项目WEB-INF文件夹下面新建一个lib文件夹并将我们需要的第三方jar包拷贝进去: Ctrl+Shift+Alt+S打开项目配置页面: 选择我们存放jar包的文件夹: 选择我们需要引入目标依 ...