Linux 交叉编译工具链格式 sqlite3编译示例

1、交叉编译工具链

1.1 定义

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发工具集,它允许开发者在一个平台上(例如高性能的PC或服务器)编译生成另一个平台(例如嵌入式系统或不同的操作系统和硬件架构)上运行的代码。在Linux系统中,交叉编译工具链主要用于嵌入式系统的开发,因为嵌入式系统通常资源有限,难以直接在其上进行编译操作。

1.2 格式

通常其格式定义如下:

arch[-vendor][-os][-(gnu)eabi][-gcc]
  • arch:目标平台的体系架构,如armx86等。
  • vendor:工具链的供应商或自定义标识符,如果没有特定供应商,通常用none代替。
  • os:目标操作系统,如linuxandroid等。如果没有特定操作系统支持,也用none代替。
  • (gnu)eabi:嵌入式应用二进制接口(Embedded Application Binary Interface),它指定了文件格式、数据类型、寄存器使用、堆栈组织优化和在一个嵌入式软件中的参数的标准约定。例如,gnueabihf适用于ARM架构的硬浮点ABI。
  • gcc:表示这是一个GCC(GNU Compiler Collection)系列的编译器

1.3 工具示例

  • arm-linux-gnueabihf-gcc
    • 架构:ARM
    • 操作系统:Linux
    • ABI:GNU EABI with Hard Float (hf)
    • 描述:用于在Linux下为ARM架构编译带有硬浮点支持的程序。
  • arm-none-linux-gnueabi-gcc
    • 架构:ARM
    • 供应商:none(表示没有特定的供应商或定制)
    • 操作系统:Linux
    • ABI:GNU EABI
    • 描述:用于在Linux下为ARM架构编译没有特定供应商标识的程序,使用标准的GNU EABI。
  • aarch64-linux-gnu-gcc
    • 架构:ARM64(也称为AArch64)
    • 操作系统:Linux
    • ABI:GNU
    • 描述:用于在Linux下为ARM64架构编译程序。
  • mips-linux-gnu-gcc
    • 架构:MIPS
    • 操作系统:Linux
    • ABI:GNU
    • 描述:用于在Linux下为MIPS架构编译程序。

关于gnugnueabi 和 gnueabihf :

  • gnugnueabi 和 gnueabihf 这些后缀在工具链命名中用于描述对EABI的不同支持级别。
  • gnu 通常是一个更通用的标识,而 gnueabi 表明对EABI的支持,但不直接指明浮点运算的形式。
  • gnueabihf 则明确表示支持硬件浮点运算。
  • 对于只包含 gnu 或 gnueabi 的工具链命名,需要通过查阅文档或参考编译器选项来确定对浮点运算的具体支持情况。

2、linux下软件的交叉编译

2.1 configure作用

configure脚本将根据当前主机系统的类型和特性来检测系统环境,包括编译器、链接器、标准库、头文件等信息,然后生成一个包含编译选项和其他配置信息的Makefile文件。这个Makefile文件将根据检测到的环境配置编译过程,确保软件能够正确编译并在目标平台上运行。

在交叉编译情况下,configure脚本还会根据用户指定的交叉编译工具链来设置正确的编译器、链接器等工具,以确保生成的可执行文件能够在目标平台上正确运行。

2.2 configure常用选项

  • --build=BUILD
    • 指定编译所用的机器的平台。通常,如果不特别指定,其默认值将等同于 --host 选项的值。
  • --host=HOST
    • 指定编译出的代码将要运行的目标平台。这是交叉编译中最重要的选项之一。HOST 通常使用目标三元组(target triple)表示,包含 CPU 架构、供应商、操作系统和 ABI。例如,x86_64-unknown-linux-gnu 表示一个 CPU 架构为 x86_64、操作系统为 Linux、ABI 为 GNU 的系统。
  • --target=TARGET
    • 指定编译出来的工具链(如编译器、链接器等)生成的代码将要运行的目标平台。这个选项在构建交叉编译环境时较为常用,尤其是在编译 gcc、ld 等工具链时。通常情况下,正常编译和交叉编译都不会用到这个选项。
  • --prefix=PREFIX
    • 指定软件安装的位置。这在交叉编译时尤为重要,因为它决定了编译出的软件将安装到哪个目录。
  • --disable-FEATURE
    • 禁用某些特性。一些软件包提供了可选的编译时配置,如使用 Kerberos 认证系统或实验性的编译器优化。如果默认是提供这些特性,可以使用此选项来禁用它们。
  • --enable-FEATURE[=ARG]
    • 启用某些默认被禁止的特性,并可以为特性指定可选的参数。例如,启用特定的缓冲区大小或特定功能的启用/禁用。
  • --srcdir=DIR
    • 告诉 configure 源码的位置。通常不需要特别指定,因为 configure 脚本通常和源码文件在同一个目录下。
  • --program-prefix=PREFIX 和 --program-suffix=SUFFIX
    • 分别指定将被加到所安装程序的名字上的前缀和后缀。这有助于区分同一台机器上安装的不同版本或不同构建的程序。
  • --program-transform-name=PROGRAM
    • 使用 sed 脚本来变换安装的程序名。
  • LDFLAGS="-L/path/to/libs" 和 CPPFLAGS="-I/path/to/includes"
    • 分别用于指定链接器和预处理器使用的额外库和头文件路径。这在交叉编译时尤其有用,因为需要指定目标平台的库和头文件路径。

3、交叉编译sqlite3

3.1 获取源码

从官网获取:SQLite Download Page,直接下载放入虚拟机即可,也可以在资源处点击右键获取下载链接然后通过wget命令下载:

wget https://www.sqlite.org/2024/sqlite-autoconf-3460000.tar.gz

下载完成:

使用tar -xzf sqlite-autoconf-3460000.tar.gz解压:

3.2 配置

进入解压后的目录,创建一个output文件夹,进行如下配置:

./configure --host=aarch64-linux-gnu --prefix=/home/aka_li/linux/mysqlite3/sqlite-autoconf-3460000/output

其中aarch64-linux-gnu要修改为你的目标主机,/home/aka_li/linux/mysqlite3/sqlite-autoconf-3460000/output为你要输出的目录。

然后顺序执行make和make install,最终编译文件输出到前面指定的output文件夹中:

3.3 编程

参考之前文章中的数据库编程代码:Linux应用 sqlite3编程编译可执行程序,其中-L指定动态库位置,-I(大写i)指定头文件目录,-l(小写L)指定动态库名称:

aarch64-linux-gnu-gcc sqlite3.c -L/home/aka_li/linux/mysqlite3/sqlite-autoconf-3460000/output/lib/ -I/home/aka_li/linux/mysqlite3/sqlite-autoconf-3460000/output/include/ -lsqlite3 -o sqlitetest

进入output文件夹打包,命令如下:

tar -czvf sqlitefile.tar.gz .

打包完拷贝至目标板中,解压后将lib目录下的库拷贝到目标板的/lib目录下,将编译完成的应用程序也拷贝至目标板中,:

执行可执行程序,可以正常运行:

4、总结

本文讲解了linux下交叉编译工具链的格式,阐述了交叉编译软件时configure的配置过程,编写了sqlite3的交叉编译示例。

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

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

相关文章

pyqt 文件浏览列表视图和图标视图

pyqt 文件浏览列表视图和图标视图 目的效果代码 目的 使用pyqt实现文件浏览列表视图和图标视图,像电脑文件浏览一样。如下图所示。 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QToolBar, QAction, Q…

03-权限绕过漏洞

一、基础知识 水平越权 水平越权是指用户在系统中拥有超出其权限范围的访问权限。这可能导致安全漏洞和潜在的风险,因为用户可以访问他们不应该有权访问的敏感信息或执行他们不应该执行的操作。 垂直越权 垂直越权是指用户或攻击者利用系统中的漏洞或错误配置&a…

Orangepi Zero2使用外设驱动库wiringOP配合定时器驱动SG90舵机

目录 一、舵机的基本认知和硬件接线 1.1 舵机的基本认知: 1.2 硬件接线: 1.3 怎么控制舵机旋转不同的角度: 二、Linux定时器 2.1 定时器setitimer()函数原型和头文件: 2.2 信号处理函数signal()原型和头文件: 2…

<电力行业> - 《第10课:变电》

1 变电 变电环节,顾名思义就是改变电压的环节,主要是在变电站和变电所完成的。变电站和变电所主要区别在于:变电站比变电所更大。 发电厂的变压器和配电变压器也属于“变电”,但我们在说电网环节时,变电特指电网公司…

【STM32嵌入式系统设计与开发---传感器拓展】——1_4_标准库FreeRTOS移植实验

目录 雅俗理解源码下载链接知识拓展步骤1:stm32f103vet6移植freeRTOS步骤:(1)准备开发环境(2)添加FreeRTOS移植 致谢 雅俗理解 雅:FreeRTOS是一个开源的实时操作系统(RTOS)&#xf…

RabbitMQ-交换机的类型以及流程图练习-01

自己的飞书文档:‌‍‬‍‬‍​‍‬​⁠‍​​​‌⁠​​‬‍​​​‬‬‌​‌‌​​​​​​‍​‍​‌⁠‬​RabbitMQ的流程图和作业 - 飞书云文档 (feishu.cn) 作业 图片一张 画rabbit-mq 消息发…

测试开发工程师需要掌握什么技能?

测试开发工程师是软件开发中至关重要的角色之一。他们负责编写、维护和执行自动化测试脚本、开发测试工具和框架,以确保软件的质量和稳定性。为了成为一名优秀的测试开发工程师,你需要掌握以下技能: 1. 编程技能: 作为测试开发工…

LabVIEW程序员应该怎么提高自己的工作能力?

作为一名LabVIEW程序员,提升工作能力可以从以下几个方面入手: 1. 深入理解LabVIEW基础 掌握LabVIEW编程语言:熟悉LabVIEW的图形化编程方式,理解其数据流编程模型。熟悉常用的VI(虚拟仪器)和函数&#xff1…

计算机网络原理及应用

第一章 计算机网络概述 【1】局域网 局域网是指在某一区域内由多台计算机互联而成的计算机通信网络。 【1】互通 两个网络之间可以交换数据。 第二章 计算机网络的体系结构 【1】语义 何时发出何种控制信息,完成何种动作以及做出何种响应。 【2】简述网络协…

有没有比较好用的网页3D应用程序在线编辑器?

问:three.js是当前主流的网页3d开发框架,但three.js的editor功能比较粗糙。国内有没有比较容易上手功能类似Unity3D的网页3D编辑软件,可以通过实体组件系统来完成程序扩展,简单拖拉拽完成3D场景、常用特效和用户交互的构建&#x…

大模型压缩-LoRAP

这里写目录标题 1.多头注意力和FFN的权重分布2 多头矩阵的低秩分解FFN无梯度通道剪枝 这篇文章 1期望找到一个“剪枝+低秩分解”的路子,使结构化剪枝达到非结构化剪枝的性能。 1.多头注意力和FFN的权重分布 Fig. 1.1 多头注意力权重矩阵 从Fig.1.1可以看…

清华大学世界排名:2025QS世界大学排名第20名

近日,国际高等教育研究机构QS Quacquarelli Symonds正式发布了2025QS世界大学排名,其中麻省理工学院连续第13年蝉联榜首,北京大学排名由去年的全球第17上升至全球第14名,清华大学位列2025QS世界大学排名第20名,以下是查…

2024.6.30周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、模型架构 四、文章解读 一、Introduction 二、创新点 三、RBM 四、贪心算法 五、实验 六、结论 二、代码复现 总结 摘要 本周我阅读了一篇题目为Generative Pre-Trained Physics-Informed Neural Netwo…

ThreadPoolExecutor 线程回收时机详解

个人博客 ThreadPoolExecutor 线程回收时机详解 | iwts’s blog 总集 想要完整了解下ThreadPoolExecutor?可以参考: 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog Worker-工作线程管理 线程池设计了内部类Worker,主要是用来…

点餐|外卖订餐小程序|基于微信小程序的外卖订餐系统设计与实现(源码+数据库+文档)

点餐|外卖订餐小程序目录 目录 基于微信小程序的外卖订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户微信端功能模块 2、管理员服务端功能模块 3、商家务端功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设…

重生奇迹MU 正确获取金币的方式

在游戏中,需要消耗大量的金币来购买红药等物品。因此,如何快速赚取金币也成为玩家关注的问题。您知道有哪些方法可以快速地获得金币吗? 一、哪个地图上是最适合打金币的很关键 在选择打钱的地方时,不能盲目行动,需要…

【C++开发必备工具】Dependency Walker与Dependencies

Dependency Walker 与 Dependencies 1. Dependency Walker1.1 功能特点1.2 使用方法1.3 注意事项 2. Dependencies2.1 功能特点2.2 使用方法2.3 注意事项 3. 总结 1. Dependency Walker Dependency Walker 是一个免费软件工具,用于查看 Windows 应用程序的模块&…

[数据集][目标检测]婴儿状态睡觉哭泣检测数据集VOC+YOLO格式7109张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):7109 标注数量(xml文件个数):7109 标注数量(txt文件个数):7109 标注…

leetCode.96. 不同的二叉搜索树

leetCode.96. 不同的二叉搜索树 题目思路 代码 // 方法一:直接用卡特兰数就行 // 方法二:递归方法 class Solution { public:int numTrees(int n) {// 这里把 i当成整个结点,j当成左子树最左侧结点,并一次当根节点尝试// f[ i ] f[ j - 1…

基于Java的会员制医疗预约服务管理信息系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:Java技术ssm框架,结合JSPM工作流引擎 工具:IDEA/Eclipse、Navicat、Maven …