ARM 交叉编译环境搭建

最近研究了一下ARM的交叉编译环境搭建,太麻烦了必须作一下记录啊。 前两个方法比较简单一点,关键是淫家Google帮你弄好了大部分功能

方案一:(利用Android ndk + jni)

使用Android NDK的第一步当然是下载Android NDK啦。 http://developer.android.com/tools/sdk/ndk/index.html 使用jni的话,还必须下载相应的Android SDK http://developer.android.com/sdk/index.html 下载完后可以使用 \$ANDROID_SDK_ROOT/sdk/tools/android update sdk –no-ui 来更新SDK包 附注:ANDROID_SDK_ROOT指代Android SDK根目录,NDK_ROOT指代Android NDK根目录。下同。 为了方便可以把\$ANDROID_SDK_ROOT/sdk/tools:\$ANDROID_SDK_ROOT/sdk/platform-tools:\$NDK_ROOT 加到环境变量PATH里去 另外,Android 如果要命令行编译,需要ant和ant扩展,需要安装 Android 依赖的32位库 大致上是 glibc.i686 libzip.i686 libzip-devel.i686 libstdc++.i686 ant ant-* jdk 其中 libc.i686 libzip.i686 libzip-devel.i686 libstdc++.i686 ant ant-* 可以用 yum install或apt-get install 安装 jdk最好是官网下一个rpm包安装 rpm -ivh *.rpm

yum install glibc.i686 libzip.i686 libzip-devel.i686 libstdc++.i686 ant ant-*  #Debian or Ubuntu
apt-get install glibc.i686 libzip.i686 libzip-devel.i686 libstdc++.i686 ant ant-*  #Redhat or Fedora or CentOS
rpm -ivh [jdk地址,如jdk-7u17-linux-x64.rpm]

使用NDK+jni交叉编译的时候需要修改Android.mk文件 位于: [工程目录]/jni/Android.mk 编译时cd进工程目录然后调用 \$NDK_ROOT/ndk-build 即可,其他的和标准的Android开发流程一样 详见:http://developer.android.com/tools/sdk/ndk/index.html 如果要打包成apk,可以执行

​ant -f build.xml clean debug -Dsdk.dir=$ANDROID_SDK_ROOT

方案二:(利用Android ndk建立独立的toolchains)

使用Android NDK的第一步当然还是下载Android NDK啦。 http://developer.android.com/tools/sdk/ndk/index.html

​这个Google提供了提取交叉编译环境的脚本,所谓不用白不用啦是吧。 还有这笔第一种方法好的地方在于,不用写Android.mk啦,大部分开源库,直接configure之后该一点点生成的不合理的地方就OK了,我拿tcpdump小试过牛刀,改了两处configure文件和三处源代码就搞定了,哈哈

# 构建交叉编译Toolchain:
$NDK_ROOT/build/tools/make-standalone-toolchain.sh --system=linux-x86_64 --toolchain=arm-linux-androideabi-4.7   # 具体的这两个参数的值要根据当前的环境搞哈
cp /tmp/... ... # 复制包,在上一条执行的结尾可以看到他把包扔哪去了
tar -zxvf ... # 解压toolchains
# 或者直接生成到目标目录
$NDK_ROOT/build/tools/make-standalone-toolchain.sh --system=linux-x86_64 --toolchain=arm-linux-androideabi-4.7 --install-dir=/tmp/my-android-toolchain  # 同样
参数的值要根据当前的环境搞哈

# 新增环境变量:
export PATH=[新toolchains路径]/bin:$PATH
export CC=arm-linux-androideabi-gcc  # 如果是其他的名字就设成其他的名字,建议实现ls一下那个目录
export CXX=arm-linux-androideabi-g++ # 如果是其他的名字就设成其他的名字,建议实现ls一下那个目录
export CXXFLAGS="-lstdc++"           # 可选

然后就可以交叉编译了,其实感觉还是 env CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ CXXFLAGS=“-lstdc++” 执行的指令 这样比较好 另外,因为Android自带的库比较少,要用个什么东西还得一个一个编译依赖库,挺坑的

方案三:(自己搞个Arm版GCC编译器)

本来打算参照 Linux 编译安装 GCC 4.8 的脚本改进而来 后来发现太麻烦了, 大概是先编译arm架构用得binutils、newlib,再准备GCC的依赖库,和编译GCC 4.8的依赖库一样,然后编译初版的arm gcc 接下来要以ARM架构为目标重新编译Linux kernel、glibc、glibc-ports、glibc-linuxthreads、libc、libz等等,然后再编译完整的cross-compile的gcc 大致是这样,太麻烦了,一时半会搞不定

方案四:(别人有编译好直接给你用哇)

无意中找到的,真的是无意 https://launchpad.net/gcc-arm-embedded 这里有很多版本的编译好的GCC和源码,也有文档教你怎么用源码编译 写得比较清晰简单,我就不Cope-Paste了. 不过用起来不太爽,我写了个hello world链接选项就要手写–specs=nano.specs -lc -lc -lrdimon 总而言之,就是很难用啊很难用

方案五:(还是人家的工具脚本)

还是无意中找到滴 http://crosstool-ng.org/ 这玩意依赖 bison gperf flex texinfo libtool ncurses-libs ncurses-devel gawk gcc gcc-c++ gcc-java glibc glibc-common libc-client-devel libc-client glibc-devel glibc-static glibc-utils (确切地说是编译GCC需要用) 使用方法依然照着文档,比较简单 还有,这个工具提供了一个可视化的图形界面,比较Nice

ct-ng menuconfig # 启动可视化界面
# 其实可以类似这样搞
ct-ng arm-unknown-linux-gnueabi
ct-ng menuconfig
# 然后Load Config,再改,比较Nice,最后再编译toolchains
ct-ng build

可以用来设置要编译的库和环境,好Nice的工具啊。不过乱选可能会搭不起来,比较麻烦 另外,他的下载包的过程啥也看不见,如果下载包失败了,可以手动去下载来对应的版本,扔进源码目录里(默认是~/src) 还是Google的用起来比较轻松愉快哈

方案六:(ARM官方推荐)

ARM官方介绍了很多工具 http://www.arm.com/zh/support/university/tools.php 不过大多是收费的 我只试用了Windows下的DS-5 点击这里可以下载 安装完毕后,bin目录里有个脚本 console.bat 可以用来生成环境变量 之后重定义CC和CXX环境变量就可以使用新的ARM编译器了(这个我也是拿tcpdump测试滴,需要改一点configure,注释掉cross compile报错的部分,而且make install也有点异常,我手动install滴)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏difcareer的技术笔记

breakpad: Native crash 日志收集工具前言正题breakpad工作原理项目集成

现在大部分应用都会有Java层的崩溃日志收集机制,一般就是程序crash后,展示一个上报界面,用户点击就上传了。 但是Native程序crash了,很少有做处...

1612
来自专栏三木的博客

使用gerrit作为代码评审工具

需求描述 其实作为项目代码的maintainer,一直习惯于mailing list + git的代码评审及管理,无奈公司主推敏捷+devops,老板让改用ge...

3686
来自专栏向治洪

再谈Android动态链接库

前不久,我们准备将自己开发的视频播放sdk提供给公司其他部门,在打包的时候,同事问了我一个问题,为什么我们打sdk的时候需要分别提供armeabi和arm64-...

2407
来自专栏c#开发者

企业库推广

企业库推广  阿新 1. 概述 可重用的程序块库,用于解决共性的企业级开发过程中所面临的挑战 l 较低风险(经过实践验证的、精准的) l 降低成本(可充用) ...

36413
来自专栏EAWorld

Resteasy ,从学会使用到了解原理

1、背景知识 1.1)了解Rest是什么? 1.2)了解JAX-RS是什么? 1.3)RestEasy简介 2、手把手教你使...

2964
来自专栏最新技术

使用Eclipse MicroProfile(更新版)构建您的下一个微服务

本快速教程将向您展示如何使用最新版本的Eclipse MicroProfile API构建您的下一个微服务。这是一篇基于以前John D Ament 的文章的修...

8352
来自专栏源码之家

如何通过SSH更改Linux系统下文件(或文件夹)的拥有者

2983
来自专栏SDNLAB

从一个 Neutron DHCP 补丁谈起

前言 前几个星期,社区通过了一个 Patch 来解决一个遗留很久的 DHCP 相关的问题,这个 Patch 并不复杂(review 地址是 https://re...

4057
来自专栏技术翻译

使用Spring Boot,Spring Cloud,Docker和一些Netflix的开源工具建立微服务架构。

本文通过使用Spring Boot,Spring Cloud和Docker构建的概念验证应用程序的示例,为了解常见的微服务架构模式提供了一个起点。

2060
来自专栏编程坑太多

『中级篇』play with docker 的使用(44)

Marcos 和 Jonathan 还带来了另一个炫酷的功能就是可以在 PWD 实例中通过拖放文件的方式将 Dockerfile 直接上传到 PWD 窗口。

661

扫码关注云+社区

领取腾讯云代金券