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滴)

Last updated