cmake 指定平台编译arm64_Arm V7 V8处理器编译Target小提示
我们经常将主流Arm设备分为以下两类:
- Arm v7-A
- 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-v7a
或arm64-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小提示相关推荐
- CMake使用详解一(单文件编译)
文章目录 1 什么是CMake 2 单个源文件编译 2.1 编写单个cpp文件 2.2 编写CMakeLists.txt 2.3 使用`cmake .`和`make`编译项目 2.3.1 执行`cma ...
- 【国产化系列】龙芯平台指令集简介及现有处理器的支持特性
DATE: 2021.10.27 文章目录 1.转载参考 2.龙芯平台指令集简介 3.编译参数 4.查找热点函数进行代码优化 1.转载参考 龙芯平台指令集简介及现有处理器的支持特性 2.龙芯平台指令集 ...
- cmake 版本 arm_在 ARM 架构服务器上编译 Greenplum6并制作rpm安装包
Greenplum 是一款开源MPP数据分析平台,提供包括数据分析.机器学习和人工智能等特色功能.目前 Greenplum 的二进制发行版本只能运行在 X86 服务器.github上的Greenplu ...
- CMake使用详解二(多文件编译)
文章目录 1 同一目录,多个源文件 1.1 创建2个源文件 1.2 编写CMakeLists.txt 1.3 编译项目 2 多个目录,多个源文件 2.1 在不同的目录下新建源代码 2.2 编写CMak ...
- 物联网平台Thingsboard3.2.1源码编译记录
1.开发环境 JDK1.8 Postgresql 11 Node.js Yarn Maven 3.6.3 Git Idea Redis 2.克隆源码 git clone https://github ...
- java编译时注解_Java注解处理器--编译时处理的注解
1. 一些基本概念 在开始之前,我们需要声明一件重要的事情是:我们不是在讨论在运行时通过反射机制运行处理的注解,而是在讨论在编译时处理的注解. 注解处理器是 javac 自带的一个工具,用来在编译时期 ...
- cmake指定gcc版本
centos的gcc版本一般比较低,有时候需要用到高版本的gcc,所以回自己装一个. cmake执行编译的时候,默认使用/usr/bin目录下的gcc/g++去进行编译,很多时候我们的库文件是用新版本 ...
- JavaScript V8引擎编译
下载: 1. 找到下载源代码的Google网站. 2.提示使用svn命令下载源文件.svn是subversion的意思.请下载subversion控制台客户端. 3.执行提示的命令,即可下载. 编译: ...
- 手动编译 lombok_Lombok,一种编译时Java注释预处理器,可最大程度地减少代码大小...
手动编译 lombok 在本文中,我们将看到如何在常规Java代码中使用lombok来最大程度地减少代码长度和冗余. 什么是Lombok? Lombok,一个编译时注释预处理器,有助于在编译时注入一些 ...
- 团队环境搭建:MTK平台,PTK5.1、Supernova编译环境配置
团队环境搭建:MTK平台,外销TV,PTK5.1.Supernova编译环境配置 文章目录 团队环境搭建:MTK平台,外销TV,PTK5.1.Supernova编译环境配置 一.前言 二.硬件环境要求 ...
最新文章
- 用Electron开发企业网盘(二)--分片下载
- vue created 调用方法_深入解析 Vue 的热更新原理,偷学尤大的秘籍?
- 成功解决:Win系统下的Tensorflow使用CPU而不使用GPU运行加速
- 你真的了解防火墙吗?
- 完全二叉树的JAVA实现(以及非递归遍历方法)
- centos apt-get java_CentOS安装jdk的三种方法
- 信息系统状态过程图_操作系统中的增强型过程状态图
- stanford-parser for C#
- RMAN backup recovery area 命令
- 音视频开发(8)---nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器
- linux系统用w程序,Linux w命令
- 以太坊2.0合约余额新增3872 ETH
- 数据结构与算法之栈的用法
- 触发器如何通知websocket_「Web应用架构」如何扩展WebSockets
- 加载Oracle驱动代码,无法加载oracle in oradb10g_home2 odbc驱动程序的安装例程,因为存在系统错误代码998 解决方法 | 学步园...
- javascript时钟代码
- tensorflow中的shape问题
- 记阿里UC跟cvte社招面试-----都挂了~
- 二进制整数及其表达方式
- Google Cloud 线上课堂 | Kubernetes 网络演进,GKE Gateway API 打开新篇章
热门文章
- mysql connections 作用_MySQL性能优化之max_connections配置参数浅析
- mysql 全连接_mysql 实现全连接
- Maven 清理 .lastUpdated 文件
- 计算机如何快速访问文件夹,高手教你如何快速定位文件夹(图文介绍)
- python 给数组修改值_DAY2-step4 Python数组:创建,追加,弹出,反转示例
- mysql远程连接error 1045_启用远程MySQL连接:错误1045(28000):用户被拒绝访问
- c++ 多线程 类成员函数_C++11多线程
- 在计算机网络GAN代表什么,图解 生成对抗网络GAN 原理 超详解
- 打开浏览器标签页并修改内容_解决因Bing导致Chrome打开标签页光标失焦的问题...
- 理解 __doPostBack--1