https://mdgsf.github.io/2020/07/23/miscellanea-cpu/

先介绍一些基础背景知识。

  1. Intel. 我们一般买的电脑都是 Intel 的 CPU。
  2. AMD. AMD 是 Intel 的最大竞争对手。AMD 的 CPU 一般也用在电脑上。
  3. ARM. ARM 的芯片一般用在手机、平板上。我的手机就是高通骁龙的。

ARM 有两层含义:

  1. ARM. 是一家半导体芯片设计研发的企业。
  2. ARM. 是与 x86 平级的 CPU 架构。

ARM CPU 架构与 x86 CPU 架构的区别:

  1. ARM CPU 架构使用 RISC(精简指令集)。
  2. x86 CPU 架构使用 CISC(复杂指令集)。

每个 CPU 都会实现一套指令集,也叫做 Instruction Set Architecture,简称 ISA

标题上的这些名字表示的是不同平台的 CPU 架构。

  1. armarm32armv7 是 32 位 ARMv7 架构。
  2. arm64aarch64 是 64 位 ARMv8 架构。
  3. x86i386i686 是 32 位 Intel x86 架构。
  4. x86_64amd64 是 64 位 Intel x86 架构。

现在的手机和电脑一般都是 64 位的,所以如果要给手机编译一个软件,一般使用 aarch64 类型的交叉编译工具链。

交叉编译工具链三元组格式介绍

Triple 三元组格式:

{arch}-{vendor}-{sys}-{abi}

明明是 4 个项,不知道为什么叫三元组。

例子:

arm-unknown-linux-gnueabihf
  • 架构(architecture):arm。
  • 供应商(vendor):unknown。这里 unknown 就是未指定供应商或者是不重要。
  • 系统(system):linux。
  • ABI:gnueabihf。gnueabihf 表示系统使用 glibc 作为其 C 标准库 libc 实现, 并且具有硬件加速浮点算法。

然后有的 triple 三元组会把供应商(vendor)或 ABI 给省略掉。例如:

x86_64-apple-darwin
  • 架构(architecture):x86_64。
  • 供应商(vendor):apple。
  • 系统(system):darwin。

那我们要怎么确定我们要用哪一个呢?

  • 架构(architecture):在 UNIX 系统上,我们可以使用 uname -m 查看。
  • 供应商(vendor):Linux 通常是 unknown,Windows 是 pc,OSX/IOS 是 apple
  • 系统(system):在 UNIX 系统上,我们可以使用 uname -s 查看。
  • ABI:Linux 上可以使用 ldd --version 查看。Mac 和 *BSD 忽略这个选项。Windows 是 gnu 或 msvc

因为我们是要给 64 位的 android 系统使用,所以一定要有 aarch64 和 android 出现,这样就可以排除掉其他不可以使用的了。 下面我们看具体要怎么选。

android 编译工具链

你可以从 ndk 下载 地址下载最新的 ndk。目前最新的稳定版本是 r21b。 我这里是 ubuntu 系统,所以下载 android-ndk-r21b-linux-x86_64.zip 这个压缩包。 解压之后得到 android-ndk-r21b 这个目录,比如就解压到 HOME 目录 /home/huangjian 下面。

我们可以编写一个如下的编译脚本,来编译最简单的 hello world 的 cpp 程序。

export NDK=/home/huangjian/android-ndk-r21b
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android
export API=29export AR=$TOOLCHAIN/bin/$TARGET-ar
export AS=$TOOLCHAIN/bin/$TARGET-as
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/$TARGET-ld
export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
export STRIP=$TOOLCHAIN/bin/$TARGET-stripecho 'AR = '$AR
echo 'AS = '$AS
echo 'CC = '$CC
echo 'CXX = '$CXX
echo 'LD = '$LD
echo 'RANLIB = '$RANLIB
echo 'STRIP = '$STRIP$CC hello.cpp -o hello

我们可以看到在目录 /home/huangjian/android-ndk-r21b/toolchains/llvm/prebuilt/linux-x86_64/bin 下面,有非常多的不同 CPU 架构的编译器,我们需要选择其中一个来使用。上面的编译脚本中, 我们选择的是 aarch64-linux-android29-clang。数字 29 是 API 的级别,详见 什么是 API 级别?。

aarch64-linux-android21-clang       armv7a-linux-androideabi23-clang    ld.lld
aarch64-linux-android21-clang++     armv7a-linux-androideabi23-clang++  lldb-argdumper
aarch64-linux-android22-clang       armv7a-linux-androideabi24-clang    llvm-addr2line
aarch64-linux-android22-clang++     armv7a-linux-androideabi24-clang++  llvm-ar
aarch64-linux-android23-clang       armv7a-linux-androideabi26-clang    llvm-as
aarch64-linux-android23-clang++     armv7a-linux-androideabi26-clang++  llvm-cfi-verify
aarch64-linux-android24-clang       armv7a-linux-androideabi27-clang    llvm-config
aarch64-linux-android24-clang++     armv7a-linux-androideabi27-clang++  llvm-cov
aarch64-linux-android26-clang       armv7a-linux-androideabi28-clang    llvm-dis
aarch64-linux-android26-clang++     armv7a-linux-androideabi28-clang++  llvm-lib
aarch64-linux-android27-clang       armv7a-linux-androideabi29-clang    llvm-link
aarch64-linux-android27-clang++     armv7a-linux-androideabi29-clang++  llvm-modextract
aarch64-linux-android28-clang       bisect_driver.py                    llvm-nm
aarch64-linux-android28-clang++     clang                               llvm-objcopy
aarch64-linux-android29-clang       clang++                             llvm-objdump
aarch64-linux-android29-clang++     clang-check                         llvm-profdata
aarch64-linux-android-addr2line     clang-cl                            llvm-ranlib
aarch64-linux-android-ar            clang-format                        llvm-readelf
aarch64-linux-android-as            clang-tidy                          llvm-readobj
aarch64-linux-android-c++filt       clang-tidy.real                     llvm-size
aarch64-linux-android-dwp           dsymutil                            llvm-strings
aarch64-linux-android-elfedit       git-clang-format                    llvm-strip
aarch64-linux-android-gprof         i686-linux-android16-clang          llvm-symbolizer
aarch64-linux-android-ld            i686-linux-android16-clang++        sancov
aarch64-linux-android-ld.bfd        i686-linux-android17-clang          sanstats
aarch64-linux-android-ld.gold       i686-linux-android17-clang++        scan-build
aarch64-linux-android-nm            i686-linux-android18-clang          scan-view
aarch64-linux-android-objcopy       i686-linux-android18-clang++        x86_64-linux-android21-clang
aarch64-linux-android-objdump       i686-linux-android19-clang          x86_64-linux-android21-clang++
aarch64-linux-android-ranlib        i686-linux-android19-clang++        x86_64-linux-android22-clang
aarch64-linux-android-readelf       i686-linux-android21-clang          x86_64-linux-android22-clang++
aarch64-linux-android-size          i686-linux-android21-clang++        x86_64-linux-android23-clang
aarch64-linux-android-strings       i686-linux-android22-clang          x86_64-linux-android23-clang++
aarch64-linux-android-strip         i686-linux-android22-clang++        x86_64-linux-android24-clang
arm-linux-androideabi-addr2line     i686-linux-android23-clang          x86_64-linux-android24-clang++
arm-linux-androideabi-ar            i686-linux-android23-clang++        x86_64-linux-android26-clang
arm-linux-androideabi-as            i686-linux-android24-clang          x86_64-linux-android26-clang++
arm-linux-androideabi-c++filt       i686-linux-android24-clang++        x86_64-linux-android27-clang
arm-linux-androideabi-dwp           i686-linux-android26-clang          x86_64-linux-android27-clang++
arm-linux-androideabi-elfedit       i686-linux-android26-clang++        x86_64-linux-android28-clang
arm-linux-androideabi-gprof         i686-linux-android27-clang          x86_64-linux-android28-clang++
arm-linux-androideabi-ld            i686-linux-android27-clang++        x86_64-linux-android29-clang
arm-linux-androideabi-ld.bfd        i686-linux-android28-clang          x86_64-linux-android29-clang++
arm-linux-androideabi-ld.gold       i686-linux-android28-clang++        x86_64-linux-android-addr2line
arm-linux-androideabi-nm            i686-linux-android29-clang          x86_64-linux-android-ar
arm-linux-androideabi-objcopy       i686-linux-android29-clang++        x86_64-linux-android-as
arm-linux-androideabi-objdump       i686-linux-android-addr2line        x86_64-linux-android-c++filt
arm-linux-androideabi-ranlib        i686-linux-android-ar               x86_64-linux-android-dwp
arm-linux-androideabi-readelf       i686-linux-android-as               x86_64-linux-android-elfedit
arm-linux-androideabi-size          i686-linux-android-c++filt          x86_64-linux-android-gprof
arm-linux-androideabi-strings       i686-linux-android-dwp              x86_64-linux-android-ld
arm-linux-androideabi-strip         i686-linux-android-elfedit          x86_64-linux-android-ld.bfd
armv7a-linux-androideabi16-clang    i686-linux-android-gprof            x86_64-linux-android-ld.gold
armv7a-linux-androideabi16-clang++  i686-linux-android-ld               x86_64-linux-android-nm
armv7a-linux-androideabi17-clang    i686-linux-android-ld.bfd           x86_64-linux-android-objcopy
armv7a-linux-androideabi17-clang++  i686-linux-android-ld.gold          x86_64-linux-android-objdump
armv7a-linux-androideabi18-clang    i686-linux-android-nm               x86_64-linux-android-ranlib
armv7a-linux-androideabi18-clang++  i686-linux-android-objcopy          x86_64-linux-android-readelf
armv7a-linux-androideabi19-clang    i686-linux-android-objdump          x86_64-linux-android-size
armv7a-linux-androideabi19-clang++  i686-linux-android-ranlib           x86_64-linux-android-strings
armv7a-linux-androideabi21-clang    i686-linux-android-readelf          x86_64-linux-android-strip
armv7a-linux-androideabi21-clang++  i686-linux-android-size             yasm
armv7a-linux-androideabi22-clang    i686-linux-android-strings
armv7a-linux-androideabi22-clang++  i686-linux-android-strip

如何选取 android 系统上的编译工具链相关推荐

  1. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...

  2. 02 A33 Android系统源码编译

    下载源码包,解包后进入Android-SDK/tools目录. 1 先安装dtc-master和fakeroot工具. dtc-master安装方法: 解包后,在源码目录下: make &&a ...

  3. Android系统上部署usb打印机

    Android系统上部署usb打印机 一.综述 android系统现多用于手持设备,为手机等设备应用提供了很好的系统级支持.但对于PC机常用的打印功能,android到目前并不支持,也没有打印机厂家专 ...

  4. gcc mips64编译后无法运行在octeon上运行_编译工具链

    软件的编译过程由一系列的步骤完成,每一个步骤都有一个对应的工具.这些工具紧密地工作在一起,前一个工具的输出是后一个工具的输入,像一根链条一样,我们称这些工具为工具链. Linux系统上,通常只需要使用 ...

  5. Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...

  6. Android驱动(1)---Ubuntu中为Android系统上编写Linux内核驱动程序实现方法

    Ubuntu中为Android系统上编写Linux内核驱动程序实现方法 本文主要介绍在Ubuntu 上为Android系统编写Linux内核驱动程序, 这里对编写驱动程序做了详细的说明,对研究Andr ...

  7. 全志T507如何在Android系统上进行OTA升级

    OTA升级是Android系统所提供的标准软件升级方式.它功能十分强大,并且提供了完全升级(完整包)和增量升级(差异包)两种模式.https://www.forlinx.com/product/133 ...

  8. BCH收银APP已在Android系统上下载超10000次

    Bitcoin Cash Register 近日,"比特币耶稣"Roger Ver在BCH论坛r/reddit发帖称,BCH收银APP"Bitcoin Cash Regi ...

  9. 绝对精华,大牛教你在Android系统上安装linux发行版

    Install linux distribution (Debian/Ubuntu/Kali Linux/Fedora/openSUSE/Gentoo/RootFS/Arch Linux) on An ...

最新文章

  1. java tooltips_一款使用纯javacript编写的轻量级tooltips工具
  2. ng2项目启动过程出现‘getSymbolByModule' of undefined‘错误
  3. BeautifulSoup学习笔记
  4. CSS清除浮动_清除float浮动
  5. 设计模式--门面(Facade)模式
  6. matlab gui自定义图片做背景,matlab GUI自定义图片做背景
  7. ImportError: No module named ‘pip._internal’
  8. ABB机器人的 备份与恢复
  9. 使用requests模块简单获取数据
  10. 初始化linux-nginx的安装和使用
  11. matlab 带有下标的赋值维度不匹配_远见另类资产管理体系下的核心系统搭建
  12. 发那科攻丝回退参数_参数-Fanuc数控系统的攻丝拉拔动作倍率即回退速度倍率
  13. 开源大数据周刊-第21期
  14. python中alpha_如何在Python中设置像素的alpha值
  15. 【读书笔记-数据挖掘概念与技术】数据仓库与联机分析处理(OLAP)
  16. 2021-05-19 退役啦
  17. 数十年从事java工作的经验分享
  18. html文件做屏保win10,给Win10系统设置一个漂亮屏保的三种方法(图文)
  19. google手机等相关产品{时间不同步}最简解决方法
  20. 继承的学习总结与感悟

热门文章

  1. 互联网界的IT巨变:从DOS的编辑器,到如今的无代码开发
  2. 语音唤醒的具体技术方案
  3. 机器人视觉系统由哪些结构组成?
  4. AppleStore下载量查看
  5. mybatis-plus报错There is no getter for property named ‘null‘ in ‘xx‘和Could not set property ‘XXX‘ of ‘
  6. jq使用请求报405错误
  7. 微信公众号无限推送消息微信群发微信定时群发微信主动推送微信客服消息
  8. mysql取当前月份两位数_SQL获取当前时间月份为两位数
  9. 马哈蒂尔:马云思维超前于时代,阿里巴巴能助力马来西亚重回正轨
  10. 使用python生成图片验证码