【QT开发(4)】Qt Creator编译器修改,应用程序二进制接口(ABI)的版本;API、ABI、系统调用是什么?版本的选择(ABI和CPU版本)

news2025/3/10 10:46:24

文章目录

  • 1.编译器的简介
  • 2 应用程序二进制接口(ABI)的版本
  • 3 API、ABI、系统调用是什么,以及这三个词的区别。
    • 3.1 什么是API?
    • 3.2 什么是ABI?
    • 3.3 API和系统调用有什么区别
  • 4 Qt for Android——关于版本的选择(ABI和CPU版本)
  • 参考

1.编译器的简介

编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序,在之前的博客3月25日 编译的四个过程不明白的可以看看。

几个常见的编译器:

(1)GCC(GNU Compiler Collection) 是一个针对于Linux和OS X的编译器。
(2)MinGW(Minimalist GNU for Windows)是一个GCC和GNU Binutils的原生软件端口,用于在Windows上开发原生的Microsoft Windows应用程序。MinGW和Qt Creator以及Qt installers for Windows一起发布。
(3)MSVC:微软的可视C++开发平台。在qt5.9以前,windows版本细分了一些版本,包括MinGW和MSVC,其中MSVC用的VS编译器,还需要安装一些Visual C++的库什么的,总之,如果你的电脑中没有安装VS那就不要安装这个版本了,否则使用时编译通不过。而在之后的版本中,就没有了这种细分,所以我们可以发现5.9之后的安装包都要比之前的大不少。
(4)Linux ICC (Intel C++ Compiler)是针对于Linux的C和C ++编译器。
(5)Clang是一个针对于Windows、Linux和OS X的C、C++、Objective C轻量级编译器。
(6)QCC是编译QNX的C++应用程序的接口。
(7)Custom自定义编译器,需手动添加编译器路径。

想要使用GCC、MinGW、Clang或QCC构建一个应用程序:

  • 首先指定路径到编译器所在的目录中,
  • 然后从可用版本的列表中选择应用程序二进制接口(ABI)的版本,也可以创建一个自定义的ABI定义。

例如设置,编译器类型为GCC

在这里插入图片描述

想要复制所选择的编译器,可以选择Clone。

  1. 在Name字段中,输入编译器的名称以便在Qt Creator中定义它。

  2. 在Compiler path字段中,输入路径到编译器所在的目录中。

  3. 在Platform codegen flags字段中,检查在目标平台中指定架构传递给编译器的标志。

  4. 在Platform linker flags字段中,检查在目标平台上指定架构传递给连接器的标志,当构建Qbs时只能使用连接器标志。其他设置依赖于编译器的指定。

  5. 在ABI字段中,为目标架构提供一个标识,用来警告包中错误的ABI配置。

2 应用程序二进制接口(ABI)的版本

ABI(Application Binary Interface):应用程序二进制接口,描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。它描述了应用程序与OS之间的底层接口。

一套完整的ABI(比如:Intel Binary Compatibility Standard (iBCS)),可以让程序在所有支持该ABI的系统上运行,而无需对程序进行修改。

ABI掩盖了各种细节,例如:

  • 调用约定控制着函数的参数如何传送以及如何接受返回值;
  • 系统调用的编码和一个应用如何向操作系统进行系统调用;
  • 以及在一个完整的操作系统ABI中,对象文件的二进制格式、程序库、目标文件格式、数据类型、数据对齐、函数调用约定以及函数如何传递参数、如何返回值、系统调用号、如何实现系统调用等。

一个完整的ABI,像 Intel二进制兼容标准 (iBCS) ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作系统上运行。

其他的 ABI 标准化细节包括C++ name decoration和同一个平台上的编译器之间的调用约定,但是不包括跨平台的兼容性。在Unix的操作系统中,存在很多运行在同一件平台上互相相关但是不兼容的操作系统(尤其是80386兼容系统)。

在这里插入图片描述

3 API、ABI、系统调用是什么,以及这三个词的区别。

简单介绍一下API、ABI、系统调用是什么,以及这三个词的区别。

这些词在习惯于像 C 这样的低级编程语言的工程师中是众所周知的,它必须考虑程序的二进制表达式。然而,最近大多数开发人员通常不知道这类知识,因为他们通常使用 Python 等高级语言。

我猜 API 对大多数开发人员来说意味着 Web API。此外,他们听说过 ABI 和系统调用,但不知道这些是什么。为了缓解这种情况,我会尽量简单地解释这些词的含义。

3.1 什么是API?

ABI不同于API ,API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译 ,然而ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。

API 是(Application Programming Interface)应用程序编程接口的首字母缩写。它是对源代码级别的函数(包括 OOPL 中的方法)的规范,这个函数是什么,应该设置什么样的参数,以及返回值是什么。它不负责这些的二进制表达式。

该示例是我在第一节中描述的 Web API。它定义了我们应该访问什么 URL 以及应该设置什么样的数据来从网站获取服务。现在的API和Web API都在使用,没有区别,现在我们理解Web API就是Web服务的API。换句话说,API 是比 Web API 更广泛的词。

我将使用以下 C 源代码再展示一个 API 示例。

int plus(int x, int y) {
  return x + y;
}

int main(void) {
  int a = 1;
  int b = 2;
  ..
  plus(a, b):
  ..
}

在本源代码中,plus() 函数的 API 如下。

  • 返回第一个参数和第二个参数之和
  • 参数和返回值的类型都是int

这里 API 并不关心更多的细节,比如 int 类型有多少字节。

3.2 什么是ABI?

ABI 来自应用程序二进制接口。它定义了函数和数据的二进制表达式。它定义了比 API 更详细的规范。它负责一个参数占用多少字节以及数据应该设置在哪里,例如堆栈顶部或 CPU 的寄存器。在某些情况下,它还定义了数据的字节序。

如果您对 x86_64 CPU 架构有基本的了解,还请参见以下 URL。

  • [calling convention维基百科页面
  • System V 应用程序二进制接口-> “3.2 函数调用序列”

例如,当从非 C 语言调用像 C 库这样的二进制库时,您应该考虑 ABI

3.3 API和系统调用有什么区别

理解 API 和系统调用之间的区别有点困难。但是,现在您可以理解它,因为您知道 API 和 ABI 是什么。

我将解释 POSIX C API、Linux 的 C API 和 Linux 的系统调用之间的区别。首先,POSIX 是类 Unix 操作系统的国际标准。 POSIX API 定义了很多东西,比如 POSIX C API,即访问操作系统服务的 C API。

Linux C API 是访问 Linux 服务的 C API。 Linux 尽量提供 POSIX C API 以兼容 POSIX C API。但是,这些与以下不同。

  • Linux 的 C API 中的一些函数与 POSIX 不兼容
  • Linux 不提供某些 POSIX C API
  • Linux提供了许多POSIX不存在的功能

系统调用是操作系统的接口。 Linux 为开发人员提供了许多系统调用,也提供了许多 C API 来使用这些系统调用。此外,本质上,我们必须执行特殊的 CPU 指令才能使用具有 CPU 相关系统调用 ABI 的系统调用。如果你对 Linux 的系统调用 API 感兴趣,请参考这个文档的 A.2.1 调用约定。它定义了 x86_64 CPU 的系统调用 ABI。

有趣的是,Linux 的 C API 中有许多函数不使用与这些函数同名的系统调用。比如Linux提供了fork()函数,但是这个函数是通过clone()系统调用来实现的。

描述了以下内容。

  • API、ABI 和系统调用是什么
  • 这两个词有什么区别
  • POSIX C API、Linux的C API、系统调用有什么区别

如今,这种知识对许多开发人员来说并不重要。但是,总有一天,您必须与低层编程作斗争。那么这篇文章会对你很有帮助。

4 Qt for Android——关于版本的选择(ABI和CPU版本)

开发Qt for Android程序的时候,不知道如何选择套件的版本,乱选一通,经常是程序开发完,到了运行选择设备的时候告诉我设备不匹配,不支持这个ABI。下面就来讲讲这些版本。

Qt中套件对应的版本

在我们安装Qt的时候,会有Android相关的选项供我们勾选,我选择了如下图所示的三个选项:
在这里插入图片描述
从名字已经可以很直观的看到 ,每个版本对应的是哪个ABI和CPU架构。我记得当时是全选了,5.12.2版的Qt貌似只提供了这三个Android的版本。

套件版本和CPU的关系

对于这两者之间的关系,有一个向下兼容的原则。选择哪个套件来构建工程,取决于你的手机CPU的架构,比如你的安卓手机CPU的架构是ARMv7,那么它可以运行armeabi-v7a编译生成的程序,也能兼容ARMv5,但是Qt没有提供这个版本。如果CPU架构是ARMv8,那么套件可以选择arm64-v8a,也能选择armeabi-v7a。

总而言之一个原则,构建工程的套件版本不能高于手机CPU架构的版本,它只能兼容比它低的版本。

详细的对应关系,如下图所示 (图片来源网络,抱歉我忘记是哪篇博客了,如果侵权请联系):
在这里插入图片描述

引入第三方库

如果想要引入第三方库,并且是用Android相关套件编译生成的库,那么同样需要注意版本的问题。跟上面一样,也是向下兼容。编译库文件所选择的套件版本,不能高于引入它的工程的套件版本。

比如我有个库文件叫libAndroid.a,我的工程要引入它,如果我的工程用的是arm64-v8a,那么编译库文件的时候套件可以选择arm64-v8a,也能选择armeabi-v7a;如果工程用的是armebi-v7a,那么编译库文件的时候套件就不能选择arm64-v8a了。

总结
以上就是在选择构建套件版本的选择问题,不是太深,但是作为C++人员来说,进行Qt for Android的开发应当是够用了。如果有存在问题的地方请不吝赐教,感谢!

参考

https://blog.csdn.net/xi_gua_gua/article/details/56999099
https://blog.csdn.net/xi_gua_gua/article/details/56999099
https://devpress.csdn.net/linux/62eed4a0c6770329307f4243.html
https://blog.51cto.com/xiaohaiwa/5437306
https://blog.csdn.net/zhounixing/article/details/89886636/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】adduser命令使用

我们经常在linux系统中创建用户。有时候用的是 useradd 有时候用的是 adduser ,好混乱啊到底用哪个啊。今天咱们一起来学习一下。 adduser与useradd的区别 useradd 命令是内置的 Linux 命令,在任何 Linux 系统中都可用。然而,使用这种低级…

Flink日志收集到数据库/kafka

引言 我们做项目过程中发现flink日志不同模式启动,存放位置不同,查找任务日志很不方便,具体问题如下: 原始flink的日志配置文件log4j-cli.properties appender.file.append false,取消追加,直接覆盖掉上…

Ansible---playbook 剧本

目录 一、playbook 1.1 playbook的组成 二、playbook的编写格式(示例) 1、定义、引用变量 2、指定远程主机sudo切换用户 3、when条件判断 4、迭代 5、Templates 模块 6、tags 模块 7、Roles 模块 一、playbook playbook是剧本的意思通过 task…

黑客技术(自学)——网络安全

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学?如何学? 今天给大家分享一下,很多人上来就说想学习黑客&#xff0c…

web安全之路的规划

前言 我自学过程中搜集的资料已经整理成一套完整的教程,需要的可以点击链接:CSDN大礼包:零基础到进阶全套学习教程,免费分享! 我的web安全学习策略 一、开始前的思考 我真的喜欢搞安全吗? 我只是想通过安全赚钱钱…

2023年【安徽省安全员C证】考试内容及安徽省安全员C证考试报名

题库来源:安全生产模拟考试一点通公众号小程序 安徽省安全员C证考试内容是安全生产模拟考试一点通总题库中生成的一套安徽省安全员C证考试报名,安全生产模拟考试一点通上安徽省安全员C证作业手机同步练习。2023年【安徽省安全员C证】考试内容及安徽省安…

Vue - 标准开发方式、组件(全局、局部、props、事件传递)、插槽的使用

目录 一、Vue 1.1、标准开发方式 1.2、组件的使用 1.2.1、全局组件 1.2.2、局部组件 1.2.3、props 传递静态数据 1.2.4、props 传递动态数据 1.2.5、事件传递 1.2.6、插槽slot 一、Vue 1.1、标准开发方式 Vue 的标准开发方式是 SPA(Single Page Applicatio…

【HCIP】ppp实验

实验要求 1、R1 和 R2 使用 PPP 链路直连,R2和R3 把2条 PPP 链路捆绑为 PPP MP 直连 2、按照图示配置 IP 地址 3、R2对R1的PPP进行单向 chap 验证 4、R2和R3的PPP进行双向 chap 验证 配置 1、如图,R1 和 R2 已使用 PPP 链路直连 2、R2 和 R3上配置…

Linux | Linux权限详解

目录 前言 一、访问角色的分类 1、用户的切换 2、root用户的理解 3、用户切换的理解 二、权限的理解 三、权限管理 1、文件的访问者 2、文件类型与访问权限 (1)文件类型 (2)访问权限 3、文件权限的修改 &#xff08…

敏捷开发中,Sprint回顾会的目的

Sprint回顾会的主要目的是促进Scrum团队的学习和持续改进。在每个Sprint结束后,团队聚集在一起进行回顾,以达到以下目标: 识别问题: 回顾会允许团队识别在Sprint(迭代)期间遇到的问题、挑战和障碍。这有助于…

专业图表绘制软件 OmniGraffle Pro mac v7.22.1中文版软件介绍

OmniGraffle Pro mac是一款Mac平台上的专业绘图软件,主要用于创建各种图形,包括流程图、组织结构图、网络拓扑图、UI原型等。该软件提供了强大的绘图工具和丰富的样式库,可以让用户快速创建出高质量的图形,并支持导入和导出各种常…

BI零售数据分析:以自身视角展开分析

随着零售业务不断扩展,市场竞争不断加剧,各层级的销售管理人员都急需一张能快速查看销售数据分析报表,能从中知道自己管辖内的业务最近或过去的情况,并依次为依据科学优化销售管理措施。这就要求零售数据分析报表信息足够多、数据…

计算机毕业设计 基于SpringBoot产业园区智慧公寓管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【Vue】vue2与WebApi跨域CORS问题

系列文章 C#底层库–记录日志帮助类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709 文章目录 系列文章前言一、技术介绍1.1 为什么会产生跨越1.2 什么是跨越 二、问题描述三、问题解决3.1 方法一:前端Vue修改3.2 方法二&#…

喜报!震坤行荣登“2023上海百强企业”两项百强榜单!

喜报!震坤行荣登“2023上海百强企业”两项百强榜单! 9月12日,上海市企业联合会、上海市企业家协会、上海市经济团体联合会和解放日报社在中国金融信息中心会议厅联合召开2023上海百强企业新闻发布会,上海市企业联合会会长刘家平主…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(六):衰减和dB

线路中的损耗对信号的主要影响是当信号沿线路长度传播时幅度减小。如果将幅度为 V 的正弦波电压信号引入传输线,则其幅度将随着传输线向下移动而下降。图 9-16 显示了如果我们可以冻结时间并观察直线上存在的正弦波,则正弦波在不同位置可能会是什么样子。…

如何让你的桌面干净得像一张白纸(详细教程)

文章目录 固定到任务栏固定到快速访问固定到“开始”屏幕添加桌面右键菜单最终效果展示程序员专属工具箱 ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的…

AQS原理及源码解析

概要 AQS是AbstractQueuedSynchronizer类的简称,为了方便,后面都以AQS来指代。AQS通过对互斥锁、共享锁和条件等待的基础实现和封装,同时为juc包下其他类提供扩展,完善了java体系的锁、线程池和并发集合类的实现,主要包…

确保第三方 API 安全的 5 个最佳实践

应用程序编程接口 (API) 已成为设置功能和灵活性不可或缺的一部分。但它们也是潜在的攻击媒介,需要在安全团队的雷达上占据很高的位置。 当组织考虑应用程序编程接口 (API) 安全性时,他们通常专注于保护内部…

AssetBundle的正确加载

需求描述 在加载一个AssetBundle资源包(后续简称AB包)的时候我们还需要考虑其对应的依赖,所以加载AssetBundle资源包并非总是简单地调用相关的加载API即可,缺乏依赖那么AssetBundle资源包中的资源就无法正常加载或使用。 通过Asse…