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…

大数据领域的常用开发语言详解

大数据开发语言主要包括以下几个,以下是它们在大数据开发领域的优缺点和应用场景的详细说明: 1. Java 优点: 跨平台性:Java的“一次编写,到处运行”的特性使得其可以轻松地运行在多个操作系统上。面向对象&#xff…

OpenCV学习之cv2.subtract函数

OpenCV学习之cv2.subtract函数 一、简介 cv2.subtract 是 OpenCV 库中的一个基本函数,用于对两幅图像进行逐像素的减法操作。 二、基本语法 cv2.subtract(src1, src2, dstNone, maskNone, dtypeNone)三、参数说明 src1 (numpy.ndarray): 第一幅输入图像或数组。 …

上海市计算机学会竞赛平台2023年6月月赛丙组差分求和

题目描述 给定一个整数序列,对其中任意两个数,计算后项减前项的差,输出这些差的差。 例如对于 𝑎1,𝑎2,𝑎3,𝑎4a1​,a2​,a3​,a4​ 来说,输出 (𝑎2−𝑎1)…

html2pdf.js生成PDF空白页面问题解决办法

现象 1、Scale参数1.8时,安卓手机在20页以上可能爆掉生成空白页 2、Scale参数1.8时,苹果手机在5页以上可能爆掉生成空白页 原因是浏览器支持画布的尺寸大小限制 解决办法 分页生成,一个元素一页这样不可能超过限制尺寸。 查到解决代码&a…

代码随想录算法训练营第四十五天|198.打家劫舍 213.打家劫舍II 337.打家劫舍III

LeetCode 198.打家劫舍 题目链接:198.打家劫舍 踩坑:很多坑,自动把它当作背包问题了,但其实这就是一个普通的动态规划题目,背包问题本质上是一个二维问题,只是可以简化成一维,想要抽象为背包问…

探索Scala的类型奥秘:协变与逆变全解析

🔄 探索Scala的类型奥秘:协变与逆变全解析 在Scala的强类型系统中,协变(covariance)和逆变(contravariance)是两个核心概念,它们允许我们在泛型编程中更灵活地使用类型。本文将深入…

03-权限绕过漏洞

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

【横穿自动驾驶】读书笔记

我自己,有时候还是有些眼高手低的,但是技术领域多读书大概是没错的。 最近想读完下面这两本书: Feedback control of dynamic systemAlgorithms for Optimization 第二本不用多说,就是求解优化问题的方法综述。横穿自动驾驶系列…

webform 连接连接数据的操作

web-form 查询数据库 ,从配置文件中读取字符信息 查询 // 从配置文件中读取数据 string sqlstr // 获取数据库连接字符串ConfigurationManager.ConnectionStrings["staffConnectionString2"].ConnectionString;DataTable dt new DataTable(); // 存储…

《零信任时代的网络安全:2024年的新挑战与机遇》

《零信任时代的网络安全:2024年的新挑战与机遇》 引言 随着数字化转型的深入,网络安全的重要性日益凸显。零信任模型作为新一代网络安全架构,其核心理念是“永不信任,始终验证”。2024年,零信任模型已经成为企业网络…

Build Redundancy at Every Tier(在每一层构建冗余)

Build Redundancy at Every Tier(在每一层构建冗余) 什么是冗余? 冗余指的是在系统的不同层次(或组件)中添加备用资源或备份,以确保在部分组件发生故障时,系统仍然能够正常运行。 为什么大型…

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

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

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

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

嵌入式软件常用测试工具

嵌入式软件常用的测试工具和方法可以总结如下: 测试工具 GDB: 描述:GDB是一个开源的调试工具,常用于GNU编译器集合中,支持多种编程语言,如C、C、Java等。功能:通过命令行与目标应用程序进行交…

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

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

支持向量机(SVM)在机器学习中的简单示例

目录 工作原理 核函数 SVM用于分类 结果分析 结论 ❤❤❤动动发财的小手点点赞点点关注哦~~~❤❤❤ 支持向量机是一种强大的监督学习模型,用于分类和回归任务。它通过找到数据点之间的最优边界来区分不同的类别。SVM特别适用于那些具有清晰边界但线性不可分的…

Codeforces Beta Round 7 C. Line 题解 数论 扩展欧几里得

Line 题目描述 A line on the plane is described by an equation A x B y C 0 AxByC0 AxByC0 . You are to find any point on this line, whose coordinates are integer numbers from − 5 ⋅ 1 0 18 -510^{18} −5⋅1018 to 5 ⋅ 1 0 18 510^{18} 5⋅1018 inclusiv…

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

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

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

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