当前位置: 首页 > news >正文

链、工具-详解如何将android工具链作为独立编译器使用-by小雨

废话就不多说了,开始。。。

 

    在现经已可以把Android NDK供提的工具链以独立编译器的方法应用了!如果你经已有了自己的构建统系,这就很有用了。

    一个典范的应用场景是调用一个赖依于CC环境变量开源库的'configure'脚本停止跨平台编译。

 

    本档文将释解如何那样做。

    

1 选择你的工具链:

    首先 ,你要需定确你的独立工具链所面向的目标CPU加构,是ARM-based设备、x86-based设备,还是MIPS-based设备。个每架构对应不同的工具链名字:

 

  * arm-linux-androideabi-4.6   => 面向ARM-based Android设备

  * x86-4.6                     => 面向x86-based Android设备

  * mipsel-linux-android-4.6    => 面向MIPS-based Android设备

 

    

2 选择你的sysroot:

    你应当解了的第二项情事是你想面向那一级Android nativeAPI 。每一级都供提了不同的API,它们被档文doc/STABLE-APIS.html所述描,并对应于$NDK/platforms的子文件夹。这使得你可以定义指向你的'sysroot'的路径 ,GCC路径下含包统系头文件和库。平日看起来像这样:

     

      SYSROOT=$NDK/platforms/android-<level>/arch-<arch>/

 

    <level> 是API level 数,<arch> 是系体结构("arm", "x86", 和"mips" 都可以作为值)。例如,如果你面向 Android2.2 (a.k.a. Froyo),你应应用:

 

   SYSROOT=$NDK/platforms/android-8/arch-arm

 

    注意:X86 和MIPS系体仅在android-9才开始支撑。

    

3调用编译器(笨办法):

    应用--sysroot项选调用编译器,以明表你所面向的平台的统系文件的路径。例如:

    export CC="$NDK/toolchains/<name>/prebuilt/<system>/bin/<prefix>gcc--sysroot=$SYSROOT"

    $CC -o foo.o -c foo.c

 

    <name> 是工具链的名字,<system> 是宿主统系,<prefix> 是特定工具链的前缀。例如,如果你在Linux上应用NDK r5 工具链,你将应用:

 

    exportCC="$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc--sysroot=$SYSROOT"

 

    就像你看到的,这很啰嗦,但的确能作工!

 

    注意:

        直接应用NDK 工具链有具很多制限:

        你不能应用任何C++ STL (无论是STLport 或GNU libstdc++) 。也不能应用异常和RTTI。

 

    

4调用编译器(轻易的办法):

    NDK 答应你创立一个"自定义的" 工具链并安装以使生活更单简。例如,面下的命令:

 

    $NDK/build/tools/make-standalone-toolchain.sh --platform=android-5--install-dir=/tmp/my-android-toolchain

 

    这将创立一个文件夹,名为 /tmp/my-android-toolchain,含包一个android-5/arch-armsysroot的考贝和工具链的行执文件。

 

    注意,默许下,ARM-based GCC 4.6 工具链将被脚本所选择。应用'--arch=x86' 来指定x86-based 的GCC,应用'--arch=mips' 来指定MIPS-based 的GCC,或应用

    '--toolchain=<name>'来指定。例如:

 

      --toolchain=x86-4.4.3               # select x86 GCC 4.4.3 compiler

     --toolchain=mipsel-linux-android-4.6  # select MIPS GCC 4.6compiler, same as --arch=mips

 

    如果你想,可以通过添加 --llvm-version=3.1 来把clang/llvm3.1也考贝去过。你可以在后之直接应用它。就像:

 

       exportPATH=/tmp/my-android-toolchain/bin:$PATH

       exportCC=arm-linux-androideabi-gcc   # or export CC=clang

       exportCXX=arm-linux-androideabi-g++  # or export CXX=clang++

 

    注意,不应用 --install-dir 项选,make-standalone-toolchain.sh将创立一个名为/tmp/ndk/<toolchain-name>.tar.bz2的tarball。这使你可以很轻易的存储并从新布发二进制工具包。

    另一个主要的利益是这个独立的工具链将含包一个GNU libstdc++的考贝,它能支撑异常和RTTI (当你接链到libstdc++ 或 libsupc++)。

 

    重点:工具链行执文件不赖依于或含包宿主上的特色路径,换句话说,它们可以被安装于任何位置,或移动到另外位置。

 

    注意:你然依可以对新的工具链应用—sysroot项选,但是在现变单简了!

    

5 ABI 兼容性:

    通过ARM 工具链生产的机器码应当与官方的Android 'armeabi' ABI兼容。推荐应用-mthumb 编译志标来强制生产16位Thumb-1令指 (默许是32-bit 的)。

 

    如果你想面向'armeabi-v7a' ABI,你应当确保面下的志标被应用:

 

  CFLAGS='-march=armv7-a-mfloat-abi=softfp -mfpu=vfpv3-d16'

 

    注:第一个志标启用Thumb-2令指,第二个启用H/W FPU令指同时确保浮点参数被传入核心寄存器,这是ABI兼容的症结。*不要*离开应用这些志标!

 

    如果你想应用Neon令指,你要需转变-mfpu编译志标:

 

  CFLAGS='-march=armv7-a-mfloat-abi=softfp -mfpu=neon'

     

    注意这会强制应用VFPv3-D32。

    还要确保面下两个志标也供提给接链器:

 

  LDFLAGS='-march=armv7-a-Wl,--fix-cortex-a8'

 

    注:第一个志标示指接链器为armv7-a选择适合的libgcc.a、libgcov.a和crt*.o。第二个志标于用在某些Cortex-A8置装中绕过一个CPU bug。

 

    如果下面这些还不能满意你,那么你最好不要用独立的工具链了,而是据守NDK构建统系,它将为你理处全部细节。

 

    当你面向x86 ABI 或MIPS ABI时你不要需应用任何特定的编译器志标。

 

    

6 告警和制限:

    


    

Windows support:

    Windows下的二进制文件*不*赖依于Cygwin。好消息是它们因此会行运快,坏消息是它们不明白Cygwin的路径情势,比如/cygdrive/c/foo/bar (而不是 C:/foo/bar)。

 

    NDK构建统系保障全部从Cygwin传给编译器的路径都被主动转换,并且为你敷衍那些难搞的情事。如果有一个自定义构建统系,你要需自己敷衍全部的问题。

 

    注:前当没有支撑Cygwin / MSys的划计。

 

    

wchar_t 支撑:

 

    在Android 2.3之前,Android平台不并真的支撑wchar_t。这示表:

    l  如果你面向android-9 或更高平台,wchar_t的小大是4bytes,并且大多数C库中的宽字节数函都可用(外例是多字节编解码数函和wsprintf/wsscanf数函)。

    l  如果你面向任何更低的API level,wchar_t 只有一个字节并且任何宽字节数函都 不能用。

 

    我们提议全部开发者都移除对wchar_t的任何赖依,并且转换到更好的方法。Android所供提的支撑仅仅是为了帮助整合已存在的代码。

 

    

异常、RTTI和STL:

 

    工具链行执文件默入是支撑C++异常和RTTI的。所以当你不要需时,应用-fno-exceptions和-fno-rtti来制止它们 (生产更少的机器码)。

 

    注:如果你想应用这些特性,你将要需明白的接链到libsupc++。要这样做,在要在接链成二进制文件时应用-lsupc++ :

 

    arm-linux-androideabi-g++ .... -lsupc++

 

    

C++ STL 支撑:

 

    独立工具链也带有一个GNU libstdc++ 库的考贝,它供提了C++准标模版库的一个现实。要应用它,你还要需接链到准确的库:

 

    l  应用-lstdc++ 来接链态静库版。这保障了全部要需的C++ STL代码都含包到了你的终究文件中。这是推荐的方法。

    应用-lgnustl_shared 来接链态动库版。如果你应用此方法,你要需确保libgnustl_shared.so也被复制到你的设备中。此文件位于:

     $TOOLCHAIN/arm-linux-androideabi/lib/ for ARM toolchains.

     $TOOLCHAIN/i686-linux-android/lib/    for x86 ones.

     $TOOLCHAIN/mipsel-linux-android/lib/  for MIPS toolchains.

 

    态动库版的GNU libstdc++不叫libstdc++.so的原因是这将致导在行运时与统系自己的最小C++行运时(/system/lib/libstdc++.so)突冲。这对态静库就没影响了。

文章结束给大家分享下程序员的一些笑话语录: 一程序员告老还乡,想安度晚年,于是决定在书法上有所造诣。省略数字……,准备好文房4宝,挥起毛笔在白纸上郑重的写下:Hello World

相关文章:

  • ireport 预览报错- the document has no pages 解决方案
  • 回车(carriage return : \r) 换行(line feed : \n)
  • ERROR 1045 (28000): Access denied for user'root'@'localhost'(using password:YES)
  • hdu 1330
  • 机械表和石英表的即时区别
  • flash版本更新导致shopex后台上传图片无效的问题
  • 使用Nagios监控esx、esxi、vcenter 之 使用外部smtp服务器发送邮件告警
  • printf()函数详解
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ASP.NET 用户配置 Part.2(SQLProfileProvider)
  • Mysql 主从复制实现原理
  • 网站整体变灰色
  • oracle中 all any in的用法
  • HDU-4473 Exam 数学分析
  • 通过iTunes检测更新,使用NSJSONSerialization解析JSON格式版本信息
  • ES6语法详解(一)
  • k8s如何管理Pod
  • Rancher-k8s加速安装文档
  • 给新手的新浪微博 SDK 集成教程【一】
  • 悄悄地说一个bug
  • 让你的分享飞起来——极光推出社会化分享组件
  • 学习HTTP相关知识笔记
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 原生Ajax
  • 再谈express与koa的对比
  • 在electron中实现跨域请求,无需更改服务器端设置
  • gunicorn工作原理
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #《AI中文版》V3 第 1 章 概述
  • #Linux(Source Insight安装及工程建立)
  • #QT(串口助手-界面)
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (二)正点原子I.MX6ULL u-boot移植
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)创业的注意事项
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./configure,make,make install的作用(转)
  • .Net Redis的秒杀Dome和异步执行
  • .net 验证控件和javaScript的冲突问题
  • .NET下的多线程编程—1-线程机制概述
  • @EnableAsync和@Async开始异步任务支持
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [20160902]rm -rf的惨案.txt
  • [20190401]关于semtimedop函数调用.txt
  • [Android Pro] AndroidX重构和映射
  • [AR Foundation] 人脸检测的流程
  • [bzoj 3534][Sdoi2014] 重建
  • [C# 开发技巧]实现属于自己的截图工具
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [dfs] 图案计数
  • [HNOI2008]水平可见直线