我们经常将主流Arm设备分为以下两类:

  1. Arm v7-A
  2. Arm v8-A

经常能听到说Arm v8-A架构向下兼容到v7,如图下所示:图片来源

「Arm V8-A」架构包含「AARCH32」和「AARCH64」两种State,每个应用程序只能运行在其中一种State下;其中「AARCH32」是「Arm v7-A」的超集,而「AARCH64」下还包含了「NEON」的double运算等特有指令;

指令集

Arm V7-A:

  • A32

Arm V8-A (AARCH 32):

  • A32
  • T32

Arm V8-A (AARCH64):

  • A64

因此我们所说的向下兼容指的是Arm V8-A的芯片能够以「AARCH32」的State运行任何针对Arm V7-A编译的应用程序;

Android

在对Android NDK编译链接的过程中,我们可以在「CMAKE」指定CMAKE_ANDROID_ARCH_ABI为:

  • armeabi-v7a
  • arm64-v8a

其中的armeabi-v7a即代表着「Arm V7-A」对应的指令集A32,而arm64-v8a则对应着「Arm V8-A」下的「AARCH64」State,即Andoird NDK并没有支持用户直接针对「Arm V8-A」下的「AARCH32」做Target编译链接。

如何针对「AARCH32」State做编译?

除了Android,还有大量的Arm平台的设备,那如何针对这些支持「Arm V8-A 」的处理器做「AARCH32」的目标编译呢?

答:可以在编译时指定 「target-triplet」为arm-arm-none-eabi,此时代表面向A32指令集编译

但是如果想用到「T32」这种只有V8才支持的特性呢? 答:可以添加编译选项 -mcpu=A53-march=armv8-a

如果使用-mcpu则可能导致编译产物因为目标硬件优化不能在其他支持Arm V8-A的CPU上运行;

AARCH32如何判断?

在代码编写时,在编译时可以通过#if __ARM_ARCH >= 8来判断当前目标Target是否针对V8做编译;

例如::arm_neon.h::中有这样的判断方式:

#if __ARM_ARCH >= 8 && defined(__ARM_FEATURE_DIRECTED_ROUNDING)
#ifdef __LITTLE_ENDIAN__
__ai float32x4_t vrndq_f32(float32x4_t __p0) {float32x4_t __ret;__ret = (float32x4_t) __builtin_neon_vrndq_v((int8x16_t)__p0, 41);return __ret;
}
#else
//...
#endif

注意区别

__arm____aarch64__等宏经常被用来判断目标架构,在Android平台下没有问题(刚刚说过,Android只支持armeabi-v7aarm64-v8a,并不支持「AARCH32」状态),

但是为了严谨区分,做了如下梳理:

  • 如果针对「Arm V7-A」做目标

    • __arm__
    • __ARM_ARCH = 7
    • __aarch64__ 无定义(为什么不能支持删除线)
  • 如果针对「Arm V8-A:AARCH64」做目标
    • __aarch64__
    • __ARM_ARCH = 8
    • __arm__ 无定义(为什么不能支持删除线)
  • 如果针对「Arm V8-AARCH32」做目标
    • __arm__
    • __ARM_ARCH = 8
    • __aarch64__ 无定义(为什么不能支持删除线)

cmake 指定平台编译arm64_Arm V7 V8处理器编译Target小提示相关推荐

  1. CMake使用详解一(单文件编译)

    文章目录 1 什么是CMake 2 单个源文件编译 2.1 编写单个cpp文件 2.2 编写CMakeLists.txt 2.3 使用`cmake .`和`make`编译项目 2.3.1 执行`cma ...

  2. 【国产化系列】龙芯平台指令集简介及现有处理器的支持特性

    DATE: 2021.10.27 文章目录 1.转载参考 2.龙芯平台指令集简介 3.编译参数 4.查找热点函数进行代码优化 1.转载参考 龙芯平台指令集简介及现有处理器的支持特性 2.龙芯平台指令集 ...

  3. cmake 版本 arm_在 ARM 架构服务器上编译 Greenplum6并制作rpm安装包

    Greenplum 是一款开源MPP数据分析平台,提供包括数据分析.机器学习和人工智能等特色功能.目前 Greenplum 的二进制发行版本只能运行在 X86 服务器.github上的Greenplu ...

  4. CMake使用详解二(多文件编译)

    文章目录 1 同一目录,多个源文件 1.1 创建2个源文件 1.2 编写CMakeLists.txt 1.3 编译项目 2 多个目录,多个源文件 2.1 在不同的目录下新建源代码 2.2 编写CMak ...

  5. 物联网平台Thingsboard3.2.1源码编译记录

    1.开发环境 JDK1.8 Postgresql 11 Node.js Yarn  Maven 3.6.3 Git Idea Redis 2.克隆源码 git clone https://github ...

  6. java编译时注解_Java注解处理器--编译时处理的注解

    1. 一些基本概念 在开始之前,我们需要声明一件重要的事情是:我们不是在讨论在运行时通过反射机制运行处理的注解,而是在讨论在编译时处理的注解. 注解处理器是 javac 自带的一个工具,用来在编译时期 ...

  7. cmake指定gcc版本

    centos的gcc版本一般比较低,有时候需要用到高版本的gcc,所以回自己装一个. cmake执行编译的时候,默认使用/usr/bin目录下的gcc/g++去进行编译,很多时候我们的库文件是用新版本 ...

  8. JavaScript V8引擎编译

    下载: 1. 找到下载源代码的Google网站. 2.提示使用svn命令下载源文件.svn是subversion的意思.请下载subversion控制台客户端. 3.执行提示的命令,即可下载. 编译: ...

  9. 手动编译 lombok_Lombok,一种编译时Java注释预处理器,可最大程度地减少代码大小...

    手动编译 lombok 在本文中,我们将看到如何在常规Java代码中使用lombok来最大程度地减少代码长度和冗余. 什么是Lombok? Lombok,一个编译时注释预处理器,有助于在编译时注入一些 ...

  10. 团队环境搭建:MTK平台,PTK5.1、Supernova编译环境配置

    团队环境搭建:MTK平台,外销TV,PTK5.1.Supernova编译环境配置 文章目录 团队环境搭建:MTK平台,外销TV,PTK5.1.Supernova编译环境配置 一.前言 二.硬件环境要求 ...

最新文章

  1. 用Electron开发企业网盘(二)--分片下载
  2. vue created 调用方法_深入解析 Vue 的热更新原理,偷学尤大的秘籍?
  3. 成功解决:Win系统下的Tensorflow使用CPU而不使用GPU运行加速
  4. 你真的了解防火墙吗?
  5. 完全二叉树的JAVA实现(以及非递归遍历方法)
  6. centos apt-get java_CentOS安装jdk的三种方法
  7. 信息系统状态过程图_操作系统中的增强型过程状态图
  8. stanford-parser for C#
  9. RMAN backup recovery area 命令
  10. 音视频开发(8)---nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器
  11. linux系统用w程序,Linux w命令
  12. 以太坊2.0合约余额新增3872 ETH
  13. 数据结构与算法之栈的用法
  14. 触发器如何通知websocket_「Web应用架构」如何扩展WebSockets
  15. 加载Oracle驱动代码,无法加载oracle in oradb10g_home2 odbc驱动程序的安装例程,因为存在系统错误代码998 解决方法 | 学步园...
  16. javascript时钟代码
  17. tensorflow中的shape问题
  18. 记阿里UC跟cvte社招面试-----都挂了~
  19. 二进制整数及其表达方式
  20. Google Cloud 线上课堂 | Kubernetes 网络演进,GKE Gateway API 打开新篇章

热门文章

  1. mysql connections 作用_MySQL性能优化之max_connections配置参数浅析
  2. mysql 全连接_mysql 实现全连接
  3. Maven 清理 .lastUpdated 文件
  4. 计算机如何快速访问文件夹,高手教你如何快速定位文件夹(图文介绍)
  5. python 给数组修改值_DAY2-step4 Python数组:创建,追加,弹出,反转示例
  6. mysql远程连接error 1045_启用远程MySQL连接:错误1045(28000):用户被拒绝访问
  7. c++ 多线程 类成员函数_C++11多线程
  8. 在计算机网络GAN代表什么,图解 生成对抗网络GAN 原理 超详解
  9. 打开浏览器标签页并修改内容_解决因Bing导致Chrome打开标签页光标失焦的问题...
  10. 理解 __doPostBack--1