专栏首页owentARM 交叉编译环境搭建

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 条评论
登录 后参与评论

相关文章

  • LLVM+Clang+Libcxx+Libcxxabi(3.6)工具链编译(完成自举编译)

    LLVM和Clang工具链的生成配置文件写得比较搓,所以略微麻烦,另外这个脚本没有经过多环境测试,不保证在其他Linux发行版里正常使用。

    owent
  • atapp的c binding和c#适配

    这两天在做服务器框架的C的接口导出和C#的接入。之所以要做这么个东西是因为之前的服务器框架(atsf4g-co)已经完成了通信层面和基本设计模式的细节部分,而且...

    owent
  • Android NDK undefined reference to ___tls_get_addr 错误

    本来看到Android的ndk都开始用gcc4.8和gcc4.9了,而且gcc4.8.1开始支持全部的c++11的特性,我就很happy地用上了。结果出现这么个...

    owent
  • QingStor 对象存储发布新版本 Python SDK

    QingStor 对象存储近日发布了新版本的 Python SDK ,并开源在https://github.com/yunify/qingstor-sdk-py...

    BestSDK
  • 第一次使用Android Studio 需要知道的一切配置。

    文章来源:http://www.cnblogs.com/smyhvae/p/4390905.html

    种花家的奋斗兔
  • [707]Apache NiFi安装及简单使用

    NiFi是美国国家安全局开发并使用了8年的可视化数据集成产品,2014年NAS将其贡献给了Apache社区,2015年成为Apache顶级项目

    周小董
  • 【leetcode】3Sum

    Given an array S of n integers, are there elements a, b, c in S such that a + b ...

    阳光岛主
  • 企业安全团队强大与否,看这八个关键指标

    ? 概述 安全人员喜欢用一些比较消极的方法来防御恶意攻击,比如“没有消息就是最好的消息”(此说法源自美国南北战争时期,由于打战死人后,家人都要收到阵亡通知书,...

    FB客服
  • Spring Boot 太狠了,一口气发布了 3 个版本!

    Spring Boot 这么狠的么,每次连发三个版本,Spring Boot 比 Java 还要版本帝啊。

    Java技术栈
  • S3C2440⑤ | S3C2440时钟体系架构及实验

    选择哪一路作为S3C2440的时钟源由模式控制引脚OM3和OM2引脚(的电平)决定,如何选择见下图:

    Mculover666

扫码关注云+社区

领取腾讯云代金券